C# MVC 4强类型视图不传递控制器的模型
不久前,我在当前的MVC4项目中构建了一个维护请求功能。它工作得很好,所以当我需要添加另一个类似的工具请求功能时,我遵循了相同的组合,只是稍微修改了表和模型属性等。现在由于某种原因,在工具请求控制器中,模型绑定似乎都不起作用(每个httppost方法接收到传递的模型的空值) 对于该功能,我创建了3个模型。本质上,一个是所有请求的列表,一个是每个请求本身的模型,以及与之相关联的注释列表,第三个是注释模型 型号:C# MVC 4强类型视图不传递控制器的模型,c#,asp.net,asp.net-mvc-4,model-binding,C#,Asp.net,Asp.net Mvc 4,Model Binding,不久前,我在当前的MVC4项目中构建了一个维护请求功能。它工作得很好,所以当我需要添加另一个类似的工具请求功能时,我遵循了相同的组合,只是稍微修改了表和模型属性等。现在由于某种原因,在工具请求控制器中,模型绑定似乎都不起作用(每个httppost方法接收到传递的模型的空值) 对于该功能,我创建了3个模型。本质上,一个是所有请求的列表,一个是每个请求本身的模型,以及与之相关联的注释列表,第三个是注释模型 型号: namespace TeamPortal.Models { publi
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; }
}
}
以下是视图:
<%@ 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>
错误输入的Spa型号代码无效。验证型号是否仍处于激活状态,以及3位数字是否正确。
请求摘要:
m、 总结)%>
型号:
m、 型号)%%>
资料来源:
m、 来源,型号.来源)%>
缺陷类型:
m、 缺陷类型,型号。缺陷类型)%>
说明:
m、 描述,12,70,新的{@class=“tinymce simple”})%>
将请求分配给:
m、 受让人,模型受让人)%>
作为一种解决方法,我可以使用FormCollection重新创建一个新模型,并在保存或重定向之前填充所需的属性,但是我真的很想知道我在这里哪里出错了(另外FormCollection是一个难题)
很奇怪,在维护要求的情况下,此功能无法正常工作。我想复制我以前的流程可以节省我的时间
希望这个问题不是“太本地化”,似乎它可能取决于解决方案,如果是这样的话,我可以在其他地方重新发布
如果有任何帮助,请告诉我是否包含了足够(或太多)的代码/信息。谢谢 当无法解析要绑定到哪个控制器参数时,默认模型绑定器将无法绑定(返回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;
.
.
.
那些“如果”真的吓坏了我……这一切都很完美,完全有道理。我假设,既然财产是资本化的,那就不会混淆了。谢谢你,伙计。
[HttpPost]
[ValidateInput(false)]
public virtual ActionResult ToolingRequestAdd(ToolingRequestModel toolingRequestModel)
{
TeamPortalService TPsvc = new TeamPortalService();
GP10Service gp10svc = new GP10Service();
toolingRequestModel.Requester = User.Identity.Name;
.
.
.