3

私は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の両方)に非常に慣れていないので、まだ本を手に入れる機会がありません。私はオンラインで情報源をまとめてきましたが、私はかなりの数の間違ったことをしていると確信しています。

編集:構文の強調表示をより安っぽくする方法はありますか?

4

1 に答える 1

2

通常、ビューモデルは、データベースからデータをフェッチするInitメソッドを持つことを目的としていません。ビューモデルは、ほとんどの場合、特定のビューが処理する必要のあるデータを保持するプロパティを含む標準のPOCOクラスです。

一方、さまざまなデータソースから情報を取得する役割を担う1つ以上のドメインモデルを持つことができます。

また、コントローラーアクションは、表示用のビューに処理される特定のビューモデルを最終的に構築するために、ドメインモデルとそのさまざまなメソッドをクエリする役割を果たします。ビューモデルは、複数のドメインモデルとさまざまなデータソースから集約されたデータを表すことができます。

したがって、基本的には、標準のGETコントローラーアクションがどのように見えるかを示す擬似コードを次に示します。

Function Index() As ActionResult
    Dim model1 As DomainModel1 = ... fetch the domain model from somewhere
    Dim model2 As DomainModel2 = ... fetch the domain model from somewhere

    Dim vm As ViewModel = ... map all the domain models to a single view model specifically designed for the view

    Return View(vm)
End Function

ここで、ドメインモデルは、使用しているさまざまなデータソース(データベース、ファイル、リモートWebサービスなど)からデータを取得する役割を果たします。ビューモデルは、ビューに適合した方法でこのデータを投影したものにすぎません。

于 2012-05-24T21:17:47.490 に答える