1

私はASP.NETMVC3でWebアプリケーションを開発しています(私の最初の)は、私が働いているエンジニアリング会社のデータ処理ステップを追跡することを意味します。

以下は、ドメインモデルの一部です。

データセット:

Partial Public MustInherit Class Dataset
    Public Property DatasetID As System.Guid
    Public Property Name As String

    Public Overridable Property ProcessDatasets As ICollection(Of ProcessDataset) = New HashSet(Of ProcessDataset)
    Public Overridable Property DeliveryBatches As ICollection(Of DeliveryBatch) = New HashSet(Of DeliveryBatch)

End Class

プロセス:

Partial Public Class Process
    Public Property ProcessID As System.Guid
    Public Property Name As String
    Public Property Type As String
    Public Property Description As String
    Public Property SOP As String
    Public Property ProcessOrder As Nullable(Of Integer)

    Public Overridable Property ProcessDatasets As ICollection(Of ProcessDataset) = New HashSet(Of ProcessDataset)

End Class

ProcessDataset :(属性付き結合テーブル)

Partial Public Class ProcessDataset
    Public Property ProcessID As System.Guid
    Public Property DatasetID As System.Guid
    Public Property OwnerID As Nullable(Of System.Guid)
    Public Property Started As Nullable(Of Date)
    Public Property Completed As Nullable(Of Date)

    Public Overridable Property Dataset As Dataset
    Public Overridable Property Process As Process
    Public Overridable Property ProcessOwner As ProcessOwner

End Class

私の目標は、(ドメインモデルを使用して)データセットのインデックスビューまたは詳細ビューから1つ以上のデータセットを選択し、Add New Process to Dataset(s)この目的の作成ビューを開くリンクをクリックすることです。[作成]ビューによって作成されたProcessDatasetは、ユーザーがリストから選択しなくても、選択したデータセットを自動的に参照します。

以下は、ProcessDataset用に作成したViewModelです。

ProcessStatusDataset:

Public Class ProcessStatusDataset

    Public Property ProcessDataset As ProcessDataset
    Public Property Datasets As IEnumerable(Of Dataset)

End Class

ProcessDatasetControllerのコントローラーメソッド:

'
' GET: /ProcessDataset/Create

Function CreateProcessStatus(id As Guid) As ViewResult
    Dim processStatus As New ProcessStatusDataset
    processStatus.Datasets = db.Datasets.Where(Function(d) d.DatasetID = id)
    ViewBag.ProcessID = New SelectList(db.Processes, "ProcessID", "Name")
    ViewBag.OwnerID = New SelectList(db.ProcessOwners, "ProcessOwnerID", "Name")
    Return View(processStatus)
End Function

'
' POST: /ProcessDataset/Create

<HttpPost()>
Function CreateProcessStatus(processstatusdataset As ProcessStatusDataset) As ActionResult
    If ModelState.IsValid Then
        For Each dataset In processstatusdataset.Datasets
            Dim processdataset As New ProcessDataset
            processdataset.ProcessID = processstatusdataset.ProcessDataset.ProcessID
            processdataset.OwnerID = processstatusdataset.ProcessDataset.OwnerID
            processdataset.Completed = processstatusdataset.ProcessDataset.Completed
            processdataset.Started = processstatusdataset.ProcessDataset.Started
            processdataset.DatasetID = dataset.DatasetID
            db.ProcessDatasets.Add(processdataset)
        Next
        db.SaveChanges()
        Return RedirectToAction("Index")
    End If

    ViewBag.ProcessID = New SelectList(db.Processes, "ProcessID", "Name", processstatusdataset.ProcessDataset.ProcessID)
    ViewBag.OwnerID = New SelectList(db.ProcessOwners, "ProcessOwnerID", "Name", processstatusdataset.ProcessDataset.OwnerID)
    Return View(processstatusdataset)

CreateProcessStatusビュー:

@ModelType ProductionDataTrackingMVC.ProcessStatusDataset
@Code
    ViewData("Title") = "Add New Process to Datasets"
End Code
<h2>
    Add New Process to Datasets</h2>
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
@Using Html.BeginForm("CreateProcessStatus","ProcessDataset")
    @Html.ValidationSummary(True)
    @<fieldset>
        <legend>Process Status</legend>
        <div class="editor-label">
            @Html.LabelForPascalCase(Function(model) model.ProcessDataset.Process):
        </div>
        <div class="editor-field">
            @Html.DropDownList("ProcessID", String.Empty)
            @Html.ValidationMessageFor(Function(model) model.ProcessDataset.ProcessID)
        </div>
        <div class="editor-label">
            @Html.LabelForPascalCase(Function(model) model.ProcessDataset.ProcessOwner):
        </div>
        <div class="editor-field">
            @Html.DropDownList("OwnerID", String.Empty)
            @Html.ValidationMessageFor(Function(model) model.ProcessDataset.OwnerID)
        </div>
        <div class="editor-label">
            @Html.LabelForPascalCase(Function(model) model.ProcessDataset.Started):
        </div>
        <div class="editor-field">
            @Html.EditorFor(Function(model) model.ProcessDataset.Started)
            @Html.ValidationMessageFor(Function(model) model.ProcessDataset.Started)
        </div>
        <div class="editor-label">
            @Html.LabelForPascalCase(Function(model) model.ProcessDataset.Completed):
        </div>
        <div class="editor-field">
            @Html.EditorFor(Function(model) model.ProcessDataset.Completed)
            @Html.ValidationMessageFor(Function(model) model.ProcessDataset.Completed)
        </div>
        <br />
        <div>
            <table>
                <tr>
                    <th>
                        Dataset Type
                    </th>
                    <th>
                        @Html.LabelForPascalCase(Function(model) model.Datasets.FirstOrDefault().Name)
                    </th>
                </tr>
    @For Each item In Model.Datasets
        Dim currentItem = item
                @<tr>
                    <td>
                        @currentItem.GetType().BaseType.Name
                    </td>
                    <td>
                        @Html.DisplayFor(Function(modelItem) currentItem.Name)
                    </td>
                </tr>
    Next
            </table>
        </div>
        <p>
            <input type="submit" value="Add New Process Status" />
        </p>
    </fieldset>
End Using
<div>
    @Html.ActionLink("Back to Process Status Datasets List", "Index")
</div>

この時点で、 POSTメソッドにProcessStatusDataset渡されるものには、とCreateProcessStatusのIDが必要な空白のGUIDが常に含まれます。プロパティもです。ProcessOwnerDatasetsNothing

レンダリングされたページのソースを見ると、次のように表示されます。

<form action="/ProcessDataset/CreateProcessStatus/e29bc119-b8c2-4ac5-9ce7-c9780673c193" method="post">

リンクの最後にあるGUIDは、詳細ビューDatasetで選択されたシングルのIDです。Dataset

誰かが私を正しい方向に向けることができますか?運が悪かったのでグーグルを検索してきました。

4

1 に答える 1

0

ドロップダウン

これはうまくいかないと思います:

...

@Html.DropDownList("ProcessID", String.Empty)

...

代わりに、次のようなことを試してください。

...

@{
    Dim processes = DirectCast(ViewBag.Processes, SelectList);
}

@Html.DropDownListFor(Function(model) model.ProcessDataset.ProcessId, processes, "Select Process")

...

'remember to set this on the post too, in case of returning the same view.
ViewBag.Processes = New SelectList(db.Processes, "ProcessID", "Name")                   

...

これにより、モデル バインダー(この概念がわからない場合は、この概念をググってみてください) がその魔法を実行できるようになります。HttpPostそれ以外の場合は、アクション メソッドの返されるタイプを に変更しFormCollection、キーを調べて、投稿から何を返しているかを確認します。

データセットの問題

投稿に何かが返されることを期待するために、HTMLフォームフィールドを設定しているとは思いません。

于 2012-07-06T16:52:56.740 に答える