2013-01-31 2 views
2

얼마 전에 현재 MVC 4 프로젝트에 유지 보수 요청 기능을 구축했습니다. 그것은 내가 비슷한 또 다른 툴링 요청 기능을 추가 할 필요가있을 때 완벽하게 작동했습니다. 툴링 요청 컨트롤러 내에서 약간의 수정 된 테이블과 모델 속성 등으로 동일한 컴포지션을 따라했습니다. 모델 바인딩 중 아무 것도 작동하지 않는 것 같습니다 (각 httppost 메소드 건네지는 모델의 null 치를 받는다).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 컨트롤러 메소드가 오류 메시지와 함께 호출됩니다.

는 컨트롤러 : 그러나 나는 ',

<%@ 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를 사용할 수있는 해결 방법으로 다음과 같습니다

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

은이다 d는 여기서 내가 잘못 들어간 곳을 알고 싶다. (게다가 FormCollection은 고통이다.)

유지 관리 요청이 정상적으로 작동하지 않는 경우 매우 이상합니다. 이전 프로세스를 복사하면 시간을 절약 할 수있을 것 같아서 ...

이 질문이 "너무 지역화되어 있지"않은 것으로 보입니다. 솔루션에 따라 다를 수 있으므로 다른 곳에서도 다시 게시 할 수 있습니다.

도움이 될 것입니다. 충분한 (또는 너무 많은) 코드/정보가 포함되어 있다면 알려주십시오. 감사!

+0

그 IFS는 정말 겁 있습니다 ... – gustavodidomenico

답변

2

바인딩 할 컨트롤러 매개 변수를 확인할 수없는 경우 기본 모델 바인더가 바인딩 (반환 null)에 실패합니다.

View 코드에서 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

. 나는 자산이 혼란스럽지 않을만큼 자본화 되었기 때문에 그것을 추측하고있었습니다. 고마워. –