얼마 전에 현재 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은 고통이다.)
유지 관리 요청이 정상적으로 작동하지 않는 경우 매우 이상합니다. 이전 프로세스를 복사하면 시간을 절약 할 수있을 것 같아서 ...
이 질문이 "너무 지역화되어 있지"않은 것으로 보입니다. 솔루션에 따라 다를 수 있으므로 다른 곳에서도 다시 게시 할 수 있습니다.
도움이 될 것입니다. 충분한 (또는 너무 많은) 코드/정보가 포함되어 있다면 알려주십시오. 감사!
그 IFS는 정말 겁 있습니다 ... – gustavodidomenico