2013-01-31 216 views
2

不久前,我在当前的MVC 4项目中构建了维护请求功能。它完美的工作,所以当我需要另一个类似的工具请求功能时,我遵循相同的组合,只是略有修改的表和模型属性等现在出于某种原因,在工具请求控制器内没有任何模型绑定似乎工作(每个httppost方法接收正在传递的模型的空值)。MVC 4强类型视图未通过控制器模型

对于我创建的3个模型的功能。从本质上讲,其中一个包含所有请求的列表,一个是每个请求本身的模型以及与其关联的注释列表,第三个是注释模型。

型号:

namespace TeamPortal.Models 
{ 
    public class ToolingRequestModels 
    { 
     public List<ToolingRequestModel> ToolingRequests { get; set; } 
     public SelectList Sources { get; set; } 
     public SelectList Assignees { get; set; } 
     public SelectList DefectTypes { get; set; } 

     public ToolingRequestModels() 
     { 
      TeamPortalService TPsvc = new TeamPortalService(); 

      Sources = new SelectList(TPsvc.GetToolingRequestSources(), "Text", "Value"); 
      Assignees = new SelectList(TPsvc.GetToolingRequestAssignees(), "Text", "Value"); 
      DefectTypes = new SelectList(TPsvc.GetToolingRequestDefectTypes(), "Text", "Value"); 
     } 

     public ToolingRequestModels(string ListType) 
     { 
      ToolingRequestModels baseModel = new ToolingRequestModels(); 

      TeamPortalService TPsvc = new TeamPortalService(); 

      List<int> RequestIDList = TPsvc.GetToolingRequests(ListType); 

      List<ToolingRequestModel> tempToolingRequests = new List<ToolingRequestModel>(); 
      foreach (int requestID in RequestIDList) 
      { 
       ToolingRequestModel tempToolingRequestModel = new ToolingRequestModel(requestID, baseModel.Sources, baseModel.Assignees, baseModel.DefectTypes); 
       tempToolingRequests.Add(tempToolingRequestModel); 
      } 
      ToolingRequests = tempToolingRequests; 
     } 
    } 

    public class ToolingRequestModel 
    { 
     public int RequestID { get; set; } 
     public string Requester { get; set; } 
     public DateTime RequestDate { get; set; } 
     public string Summary { get; set; } 

     public SelectList Sources { get; set; } 
     public string Source { get; set; } 

     public string Description { get; set; } 

     public SelectList Assignees { get; set; } 
     public string AssignedTo { get; set; } 

     public SelectList DefectTypes { get; set; } 
     public string DefectType { get; set; } 

     public string Status { get; set; } 
     public string Model { get; set; } 
     public DateTime? CompletionDate { get; set; } 
     public bool CloseRequest { get; set; } 

     public string AddNote { get; set; } 
     public List<ToolingNoteModel> Notes { get; set; } 

     public ToolingRequestModel() 
     { 
      TeamPortalService TPsvc = new TeamPortalService(); 

      Sources = new SelectList(TPsvc.GetToolingRequestSources(), "Text", "Value"); 
      Assignees = new SelectList(TPsvc.GetToolingRequestAssignees(), "Text", "Value"); 
      DefectTypes = new SelectList(TPsvc.GetToolingRequestDefectTypes(), "Text", "Value"); 
     } 

     public ToolingRequestModel(int requestID, SelectList slSources, SelectList slAssignees, SelectList slDefectTypes) 
     { 
      TeamPortalService TPsvc = new TeamPortalService(); 

      ToolingRequestModel modelDetails = TPsvc.GetToolingRequestDetails(requestID); 

      RequestID = requestID; 
      Requester = modelDetails.Requester; 
      RequestDate = modelDetails.RequestDate; 
      Summary = modelDetails.Summary; 
      Sources = slSources; 
      Source = modelDetails.Source; 
      Description = modelDetails.Description; 
      Assignees = slAssignees; 
      AssignedTo = modelDetails.AssignedTo; 
      DefectTypes = slDefectTypes; 
      DefectType = modelDetails.DefectType; 
      Status = modelDetails.Status; 
      Model = modelDetails.Model; 
      CompletionDate = modelDetails.CompletionDate; 

      Notes = TPsvc.GetToolingRequestNotes(requestID); 


     } 
    } 

    public class ToolingNoteModel 
    { 
     public int ToolingNoteID { get; set; } 
     public int RequestID { get; set; } 
     public string NoteText { get; set; } 
     public string NoteAuthor { get; set; } 
     public DateTime NoteCreateDate { get; set; } 
    } 
} 

为了简化问题,我们可以只看控制器和视图中添加一个新的请求,但该模型结合试图更新请求时也是失败的。相当直接的输入形式,它有一个检查来验证我们有模型输入的记录,并且没有记录被找到,get控制器方法被调用并带有错误消息。

控制器:

 [ValidateInput(false)] 
    public virtual ActionResult ToolingRequestAdd(bool? requestAdd, bool? badModel) 
    { 
     ToolingRequestModel model = new ToolingRequestModel(); 

     if (requestAdd == true) 
     { 
      ViewBag.RequestAdd = true; 
     } 
     else 
     { 
      ViewBag.RequestAdd = false; 
     } 

     if (badModel == true) 
     { 
      ViewBag.BadModel = true; 
     } 
     else 
     { 
      ViewBag.BadModel = false; 
     } 

     return View(model); 
    } 

    [HttpPost] 
    [ValidateInput(false)] 
    public virtual ActionResult ToolingRequestAdd(ToolingRequestModel model) 
    { 
     TeamPortalService TPsvc = new TeamPortalService(); 
     GP10Service gp10svc = new GP10Service(); 

     model.Requester = User.Identity.Name; 
     model.RequestDate = DateTime.Now; 
     model.Status = "New"; 

     if (gp10svc.CheckModelCode(model.Model)) 
     { 
      return RedirectToAction("ToolingRequestAdd", new 
      { 
       requestAdd = false, 
       badModel = true 
      }); 
     } 

     TPsvc.SaveToolingRequest(model); 

     return RedirectToAction("ToolingRequestAdd", new 
     { 
      requestAdd = true 
     }); 
    } 

这里是视图:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/FixedColumn.Master" Inherits="System.Web.Mvc.ViewPage<TeamPortal.Models.ToolingRequestModel>" %> 

<asp:Content ID="Content3" ContentPlaceHolderID="HeadContent" runat="server"> 
</asp:Content> 

<asp:Content ID="Content4" ContentPlaceHolderID="LeftContent" runat="server"> 
     <% Html.RenderPartial("LocalNavToolingRequests"); %> 
</asp:Content> 

<asp:Content ID="Content2" ContentPlaceHolderID="RightContent" runat="server"> 

<div class="box"> 
     <!-- box/title --> 
     <div class="title"> 
      <h5> 
       Add Tooling Request</h5> 
     </div> 
     <%if (ViewBag.RequestAdd) 
      { %> 
       <div class="messages"><div id="successes0" class="message message-success"><div class="image"><img height="32" src="/Content/images/icons/success.png"></div><div class="text"><h6>Success</h6><span>Tooling Request Saved Successfully.</span></div><div class="dismiss"><a href="#successes0"></a></div></div></div> 
     <% } %> 
     <%if (ViewBag.BadModel) 
      { %> 
       <div class="messages"><div id="errors0" class="message message-error"><div class="image"><img height="32" src="/Content/images/icons/error.png"></div><div class="text"><h6>Error</h6><span>The Spa Model Code Entered Was Invalid. Verify The Model Is Still Active And The 3 Digits Are Correct.</span></div><div class="dismiss"><a href="#errors0"></a></div></div></div> 
     <% } %> 

     <% using (Html.BeginForm()) 
      { %> 

      <div class="form"> 
      <div class="fields"> 

      <div class="field field-first"> 
       <div class="label"> 
        <label>Request Summary:</label> 
       </div> 
       <div class="textbox"> 
        <%: Html.TextBoxFor(m=>m.Summary) %> 
       </div> 
      </div> 

      <div class="field"> 
       <div class="label"> 
        <label>Model:</label> 
       </div> 
       <div class="textbox"> 
        <%: Html.TextBoxFor(m=>m.Model) %> 
       </div> 
      </div> 

      <div class="field"> 
       <div class="label"> 
        <label>Source:</label> 
       </div> 
       <div class="select"> 
        <%: Html.DropDownListFor(m => m.Source, Model.Sources)%> 
       </div> 
      </div> 

      <div class="field"> 
       <div class="label"> 
        <label>Defect Type:</label> 
       </div> 
       <div class="select"> 
        <%: Html.DropDownListFor(m => m.DefectType, Model.DefectTypes)%> 
       </div> 
      </div> 

      <div class="field"> 
       <div class="label"> 
        <label>Description:</label> 
       </div> 
       <div class="textarea textarea-editor"> 
        <%: Html.TextAreaFor(m => m.Description, 12, 70, new { @class = "tinymce-simple" })%> 
       </div> 
      </div> 

      <% if (HttpContext.Current.User.IsInRole("Tooling")) 
       { %> 
      <div class="field"> 
       <div class="label"> 
        <label>Assign Request To:</label> 
       </div> 
       <div class="select"> 
        <%: Html.DropDownListFor(m => m.AssignedTo, Model.Assignees)%> 
       </div> 
      </div> 
      <%} %> 

      </div> 
      </div> 
      <input id="submit" name="submit" type="submit" value="Submit Request" /> 
     <%} %> 

</div> 

</asp:Content> 

作为一种变通方法,我可以使用的FormCollection重新建立一个新的模式和保存或重定向之前填写所需要的性能,但是我d真的很想知道我在哪里出错了(加上FormCollection是一个痛苦)。

很奇怪的是,这在维护请求正常工作的情况下失败。我以为复制我以前的过程会节省我的时间...

希望这个问题不是“太本地化”,好像它可能取决于解决方案,我可以重新发布这个地方,如果是这样的话。

任何帮助都会很棒,让我知道是否包含足够(或太多)的代码/信息。谢谢!

+0

那些疑问真的吓到我了... – gustavodidomenico

回答

2

当它无法解析要绑定的控制器参数时,默认的模型联编程序将无法绑定(返回null)。

从您的查看代码看起来,您还必须拥有一个名为Model的模型属性。我会说这是在ToolingRequestAdd HttpPost控制器中使用参数名称model的默认模型绑定中发生碰撞。

如果您将参数名称从model更改为toolingRequestModel之类的其他东西,我想这会解决问题。

例如:

[HttpPost] 
[ValidateInput(false)] 
public virtual ActionResult ToolingRequestAdd(ToolingRequestModel toolingRequestModel) 
{ 
    TeamPortalService TPsvc = new TeamPortalService(); 
    GP10Service gp10svc = new GP10Service(); 

    toolingRequestModel.Requester = User.Identity.Name; 
         . 
         . 
         . 
+0

这完美的工作,非常有意义。我假设,因为该财产是大写,不会混淆。谢啦。 –