0

だから私は2つの方法があります:

    public ActionResult Create(Guid id)
    {
        Assignment viewModel = new Assignment();
        viewModel.Classroom = classroomRepository.GetByID(id);
        return View(viewModel);
    } 

    [HttpPost]
    public ActionResult Create(Assignment assignment)
    {
        if (ModelState.IsValid)
        {
            assignmentRepository.Insert(assignment);
            assignmentRepository.Save();
            return RedirectToAction("Index");
        }
        return View(assignment);
    }

ご覧のとおり、作成ページをロードすると、クラスルームがviewModelにロードされます。これは機能し、ビューに正しいClassroomを表示します。

CreateメソッドにPOSTすると、問題が発生します。assignment渡したオブジェクトには、GETで渡したClassroomが含まれていません(NULLです)。

編集〜ビューを表示するには:

@model My_School_Book.Models.Assignment
@{
    ViewBag.Title = "Create";
}
<div class="span9">
    <div class="row-fluid">
        <h1>Creating New Assignment:</h1>
        <hr />
        @using (Html.BeginForm("Create", "Assignment", FormMethod.Post, new { @class = "form-horizontal" }))
        {
            @Html.ValidationSummary(true)

            <div class="control-group">
                @Html.LabelFor(model => model.Classroom.Name, "Classroom", new { @class = "control-label" })
                <div class="controls">
                    <span style="font-size: 26px;">@Html.DisplayTextFor(model => model.Classroom.Name)</span>
                </div>
            </div>

            <div class="control-group">
                @Html.LabelFor(model => model.Name, new { @class = "control-label" })
                <div class="controls">
                    @Html.TextBoxFor(model => model.Name)
                    @Html.ValidationMessageFor(model => model.Name)
                </div>
            </div>

            <div class="control-group">
                @Html.LabelFor(model => model.Description, new { @class = "control-label" })
                <div class="controls">
                    @Html.TextAreaFor(model => model.Description)
                    @Html.ValidationMessageFor(model => model.Description)
                </div>
            </div>

            <div class="control-group">
                @Html.LabelFor(model => model.AssignedDate, new { @class = "control-label" })
                <div class="controls">
                    <div class="input-prepend">
                        <span class="add-on"><i class="icon-calendar"></i></span>@Html.TextBoxFor(model => model.AssignedDate)
                    </div>
                    @Html.ValidationMessageFor(model => model.AssignedDate)
                </div>
            </div>

            <div class="control-group">
                @Html.LabelFor(model => model.DueDate, new { @class = "control-label" })
                <div class="controls">
                    <div class="input-prepend">
                        <span class="add-on"><i class="icon-calendar"></i></span>@Html.TextBoxFor(model => model.DueDate)
                    </div>
                    @Html.ValidationMessageFor(model => model.DueDate)
                </div>
            </div>

            <div class="control-group">
                @Html.LabelFor(model => model.Weight, new { @class = "control-label" })
                <div class="controls">
                    @Html.TextBoxFor(model => model.Weight, new { @class = "span2" })
                    @Html.ValidationMessageFor(model => model.Weight)
                </div>
            </div>

            <div class="control-group">
                @Html.LabelFor(model => model.Total, new { @class = "control-label" })
                <div class="controls">
                    @Html.TextBoxFor(model => model.Total, new { @class = "span2" })
                    @Html.ValidationMessageFor(model => model.Total)
                </div>
            </div>

            <div class="form-actions">
                <button type="submit" class="btn btn-primary"><i class="icon-plus-6"></i>&nbsp;Create</button>
                <a href="@Url.Action("Index", "Assignment")" class="btn btn-primary"><i class="icon-back"></i>&nbsp;Cancel</a>
            </div>
        }
    </div>
</div>
@section Scripts
{
    <script type="text/javascript">
        $(function () {
            $("#AssignedDate").datepicker({
                showOtherMonths: true,
                selectOtherMonths: true,
                dateFormat: "DD MM d, yy",
                minDate: -14,
                onSelect: function (selectedDate) {
                    $("#DueDate").datepicker("option", "minDate", selectedDate);
                }
            });
            $("#DueDate").datepicker({
                dateFormat: "DD MM d, yy",
                minDate: 0,
                onSelect: function (selectedDate) {
                    $("#AssignedDate").datepicker("option", "maxDate", selectedDate);
                }
            });
        });
    </script>
}
4

3 に答える 3

2

Classroom.Nameのみを含めているため、フォームの投稿には、モデルバインダーがモデルに入力するものは何もありません。

しかし、本当に教室を元に戻す必要がありますか?何を達成しようとしていますか?IDが必要な場合は、次のように書き留めてください。

@ Html.HiddenFor(o => o.Classroom.ClassroomId)

(またはIDが何であれ)サーバー側にロードし直します。

本当に必要な場合は、を介して入力として書き出すことができます

@ Html.EditorFor(o => o.Classroom)

これにより、エンドユーザーが必要とは思わない変更を行うことができるため、ID(GUID)を使用します。

于 2012-08-22T14:06:21.423 に答える
0

Classroomが投稿を存続させたい場合は、それを追加して、hiddenfieldのフォームに追加する必要があります。

これをフォームに追加するだけです。

@Html.HiddenFor(m=m.Classroom.ClassroomId)
@Html.HiddenFor(m=m.Classroom.ClassroomName)
于 2012-08-22T14:25:10.507 に答える
0

私はビューモデルを使用することになりました:

public class AssignmentCreateData
{
    public Guid ClassroomID { get; set; }
    public String ClassroomName { get; set; }
    public Assignment Assignment { get; set; }
}

私のコントローラーは次のようになりました。

    public ActionResult Create(Guid id)
    {
        AssignmentCreateData viewModel = new AssignmentCreateData();
        Classroom classroom = classroomRepository.GetByID(id);
        viewModel.ClassroomID = classroom.ClassroomID;
        viewModel.ClassroomName = classroom.Name;
        viewModel.Assignment = null;
        return View(viewModel);
    } 

    [HttpPost]
    public ActionResult Create(AssignmentCreateData viewModel)
    {
        if (ModelState.IsValid)
        {
            viewModel.Assignment.ClassroomID = viewModel.ClassroomID;
            assignmentRepository.Insert(viewModel.Assignment);
            assignmentRepository.Save();
            return RedirectToAction("Index");
        }
        return View(viewModel);
    }

次に、私のビューには次のものが含まれます。

@Html.HiddenFor(model => model.ClassroomID) 
于 2012-08-22T16:19:46.047 に答える