私はMVCにまったく慣れておらず、ベストプラクティスに従おうとしていますが、どちらかの特定の基本を理解していない可能性があると思います
-a。モデルとビューモデルを適切に使用する-b。検証のためにモデルをコントローラーに渡します。
私のプログラムの一般的な目的は、ストアドプロシージャのリストからストアドプロシージャを選択し、ユーザーがすべての適切な入力変数に入力できるフォームを作成して、そのストアドプロシージャを実行することです。このツールは技術者以外の人向けなので、最終的にはかなりの入力検証を行う必要があります。
そのため、4つのモデルがあります。スクリプトモデル、パラメーターモデル、パラメーター列挙型モデル、クエリモデル、および2つのビューモデルです。入力するフォームを生成するparamviewmodelと、可能なスクリプトで埋められたリストボックスを作成するscriptviewmodelです。選択肢。事前に作成されたデータベースシステムを使用して、コントローラーのinitメソッドでビューモデルに入力しています(これを行う適切な方法がわかりません)。
ビューモデルは次のとおりです。
Imports System
Imports System.Collections.Generic
Public Class ScriptViewModel
Public Property SelectedItemId As Integer
Public Property Scripts As DataTable
Public Property ScriptList As List(Of ScriptModel)
Sub InitScriptData()
' Fills the data from an outside database.
' And fills out the properties above. Does nothing else
End Sub
End Class
もう一つの方
Imports System
Imports System.Collections.Generic
Public Class ParamViewModel
Public Property Params As DataTable
Public Property ParamEnums As DataTable
Public Property ParameterList As List(Of ParameterModel)
Public Property ParamEnumList As List(Of ParamEnumModel)
Public Property ParamEnumDictionary As Dictionary(Of Integer, List(Of ParamEnumModel))
Sub InitParamData(ByVal Script_Index As String)
' Uses an outside database
' Fills out all the above variables
End Sub
End Class
関連するビューは次のようになります。
脚本:
@ModelType Scripter.ScriptViewModel
@Html.ValidationSummary("Please correct the errors and try again.")
@Using (Html.BeginForm("ParamChoice", "Parameter", FormMethod.Post))
@<div>
@Html.ListBox("ScriptListBox", New SelectList(Model.ScriptList, "Script_Index", "CustomerScriptName"), New With {.class = "LargeListBox", .title = "LargeListBox"})
</div>
@<input type="submit" value="Execute Script" />
End Using
ParamChoice:
@ModelType Scripter.ParamViewModel
@Code
ViewData("Title") = "ParamChoice"
End Code
<h2>ParamChoice</h2>
<!-- Helper Method defined in App_Code that creates a form with a dynamic number of fields of appropriate input types -->
@HelperMethods.CreateVariableInputParameterFields(Model.ParameterList, Model.ParamEnumDictionary)
上記のヘルパー(これが私の主な混乱の原因です)(注:継承ヘルパーページは、app_codeの@helperでhtmlhelpersを使用できるようにするクラスを指します)
@inherits Scripter.HelperPage
@Imports System.Web.Mvc
@Imports System.Web.Mvc.Html
@helper CreateVariableInputParameterFields(ByVal ParamList As List(Of Scripter.ParameterModel), ByVal EnumDictionary As Dictionary(Of Integer, List(Of Scripter.ParamEnumModel)))
Dim item As Scripter.ParameterModel
@Html.ValidationSummary("Please correct the errors and try again.")
Using (Html.BeginForm("QueryServer", "Query", FormMethod.Post))
Dim iterator As Integer = 0
Dim ParamValue(ParamList.Count) As String
Dim ParamName(ParamList.Count) As String
Dim ParamType(ParamList.Count) As String
For Each item In ParamList
If (String.Compare(item.ParamType, "Int") = 0 Or String.Compare(item.ParamType, "String") = 0) Then
@<br />
@Html.Label(item.ParamName)
@Html.TextBox("ParamValue", Nothing, New With {.class = "text-box", .id = CStr(iterator)})
@Html.Hidden("ParamName", item.ParamName, New With {.id = CStr(iterator)})
@Html.Hidden("ParamType", item.ParamType, New With {.id = CStr(iterator)})
iterator += 1
ElseIf (String.Compare(item.ParamType.ToString, "Enum") = 0) Then
Dim tlist = EnumDictionary.Item(item.Param_Index)
@<br />
@Html.Label("label", item.ParamName, New With {.class = "display-label"})
@Html.DropDownList("ParamValue", New SelectList(tlist, "EnumValue", "EnumValue"), New With {.id = CStr(iterator)})
@Html.Hidden("ParamName", item.ParamName, New With {.id = CStr(iterator)})
@Html.Hidden("ParamType", item.ParamType, New With {.id = CStr(iterator)})
iterator += 1
Else
@<br />
@Html.Label("label", item.ParamName, New With {.class = "display-label"})
@Html.CheckBox("ParamValue", Nothing, New With {.id = CStr(iterator)})
@Html.Hidden("ParamName", item.ParamName, New With {.id = CStr(iterator)})
@Html.Hidden("ParamType", item.ParamType, New With {.id = CStr(iterator)})
iterator += 1
End If
Next
@Html.Hidden("Script_Index", ParamList.Item(0).Script_Index)
@<div>
<input type="submit" value="Query Server"/>
</div>
Html.EndForm()
End Using
End helper
私がやってきたことの例としてのスクリプトコントローラー:
Namespace Scripter
Public Class ScriptController
Inherits System.Web.Mvc.Controller
Function Index() As ActionResult
Dim Test As New ScriptViewModel
Test.InitScriptData()
Return View(Test)
End Function
End Class
End Namespace
申し訳ありませんが、上記のすべてがとても醜いです、私は機能を解決しようとしています。また、ほとんどが表示コードですが、これはビュー内のコードが多すぎる可能性があると思います。
とにかく、私は2つの主要な質問があります。1つは、コントローラーでモデルを作成し、そのモデルでinitメソッドを呼び出してから、それをビューに渡すことは、mvcコンテキストでは意味がありますか(そうでない場合は、どのように進めますか?)。2つ目は、htmlhelperで出力したフォームで検証を実行したいが、クエリモデルの検証(paramviewmodelではなく)を使用したい場合、どうすればよいですか?私が見た例のほとんどは、適切なモデル変数を受け取るコントローラーを含み、バインディングはコントローラー自体の外部で実行されます。次に、modelstateをチェックします。ここで似たようなことをする方法はありますか?
ここで私のコードを自由に撃ち落としてください。私はこれ(vb.netとmvcの両方)に非常に慣れていないので、まだ本を手に入れる機会がありません。私はオンラインで情報源をまとめてきましたが、私はかなりの数の間違ったことをしていると確信しています。
編集:構文の強調表示をより安っぽくする方法はありますか?