2012-08-22 52 views
0

所以,我有兩種方法:ViewModel分配了一個對象,我怎樣才能將它傳回到Post?

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); 
    } 

正如你可以看到,當我加載了我創建頁面,我加載一個教室到視圖模型。這將工作並在視圖上顯示正確的課堂。

當我POST到Create方法時,我的問題發生了,我的assignment對象現在不包含(它是NULL)我在GET中傳入的課堂。

編輯〜要顯示視圖:

@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> 
} 
+0

您能否顯示您的視圖(您提交的內容)? –

+0

@KirillBestemyanov包含在編輯 –

回答

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) 
2

你只包括Classroom.Name,從而對錶單提交無所不有該模型用粘結劑來填充你的模型。

你真的需要回教室嗎?你想達到什麼目的? 如果你需要的只是ID寫出來的:

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

(或任何ID爲),並加載備份在服務器端。

如果你真的需要它 - 你可以通過它

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

寫出來作爲輸入,然後允許最終用戶修改它,我不認爲你想要的,所以我會使用的ID( GUID)。

0

如果希望課堂生存後,那麼你需要將它添加到形成hiddenfield:

只需添加到這個形式:

@Html.HiddenFor(m=m.Classroom.ClassroomId) 
@Html.HiddenFor(m=m.Classroom.ClassroomName) 
+0

幾乎與上述相同的東西不是? –

+0

在上面的答案中,您需要通過ClassroomId從數據庫獲取控制器中的ClassroomName。你不需要它。但是選擇什麼樣的答案取決於您想要如何處理「課堂」。 –

+0

當服務器端(即數據庫)已存在的值存儲名稱時,容易被篡改,xss(腳本注入,懸掛html攻擊等)。我通常只會保存身份證,並允許有希望的可信任課堂名稱來自加入。 –

相關問題