好的伙计们,需要一些帮助!
我正在使用asp.net mvc3 razor(我相当新,但做了很多网页表单)
好的,问题
我的问题围绕提交视图。 我有一个非常复杂的模型,我的视图基于(强类型)。
我想将模型返回到控制器的HttpPost方法中的参数中。基本上做:
public ActionResult Personal()
{
DataModel dataModel = new DataModel();
FormModel model = new FormModel();
model.candidateModel = dataModel.candidateModel;
model.lookupModel = new LookupModel();
return View(model);
}
[HttpPost]
public ActionResult Personal(FormModel formModel)
{
if (ModelState.IsValid)
{
//stuff
}
return View(formModel);
}
现在...
我在post方法的formModel参数中获取值时遇到了麻烦。
这可行(意思是我可以看到这个值),但是很繁琐,因为我必须准确地写出它在每个字段的字符串中的位置:
@Html.TextBox("formModel.candidateModel.tblApplicant.FirstName", Model.candidateModel.tblApplicant.FirstName)
它呈现如下:
<input name="formModel.candidateModel.tblApplicant.FirstName" id="formModel_candidateModel_tblApplicant_FirstName" type="text" value="Graeme"/>
这不起作用:
@Html.TextBoxFor(c => c.candidateModel.tblApplicant.FirstName)
它呈现如下:
<input name="candidateModel.tblApplicant.FirstName" id="candidateModel_tblApplicant_FirstName" type="text" value="Graeme"/>
现在我假设问题在于id的差异
所以请回答我:
快速澄清: 当我说textboxfor无法正常工作时,我获取表格的时候会得到值。所以他们填写,但在POST /提交时,我无法在参数中的formModel中看到它们。
另一方面注意:
没有html帮助器工作,这是问题所在。它们也没有出现在模型状态中。
感谢大家的帮助
答案:
html.TextBoxFor and html.Textbox, POSTing values, model in parameters
在某个地方我的视图中出现问题,我在这个答案中用代码片段替换了所有代码并且它有效。
再次感谢您
答案 0 :(得分:7)
我是否正确地采取了这种方式
是
为什么textboxfor没有获得正确的值/ id,以及如何让它获得正确的值/ id以便我可以在POST中检索它(如果这甚至是问题)?
您的代码中还有其他内容使其无效。由于您没有显示所有代码,因此很难说。这是一个完整的工作示例,它说明并证明您的代码还有其他内容:
型号:
public class FormModel
{
public CandidateModel candidateModel { get; set; }
}
public class CandidateModel
{
public Applicant tblApplicant { get; set; }
}
public class Applicant
{
public string FirstName { get; set; }
}
控制器:
public class HomeController : Controller
{
public ActionResult Index()
{
return View(new FormModel
{
candidateModel = new CandidateModel
{
tblApplicant = new Applicant
{
FirstName = "fn"
}
}
});
}
[HttpPost]
public ActionResult Index(FormModel formModel)
{
// the username will be correctly bound here
return View(formModel);
}
}
查看:
@model FormModel
@using (Html.BeginForm())
{
@Html.EditorFor(c => c.candidateModel.tblApplicant.FirstName)
<button type="submit">OK</button>
}
此外,似乎textboxfor在某种程度上是限制性的 如果你有一个日期时间,你如何使用.toshortdate() 方法?这让我觉得textboxfor对我没用。
我同意TextBoxFor
是限制性的。这就是为什么我建议您始终使用EditorFor
代替TextBoxFor
。它允许您使用[DisplayFormat]
属性和voilà简单地装饰您的视图模型属性。你得到任何你喜欢的格式。
例如:
public class MyViewModel
{
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
public DateTime CreatedAt { get; set; }
}
并在视图中:
@model MyViewModel
@Html.EditorFor(x => x.CreatedAt)
将完全按照您的预期格式化日期。
答案 1 :(得分:0)
如果您的视图是强类型的,请尝试下面的帮助程序,而不是调用每个属性上的每个帮助程序
@Html.EditorForModel()
@Html.EditorFor(m => m.candidateModel)
@Html.EditorFor(m => m.lookupModel)
更新
那么,是否已尝试使用viewmodel来简化此任务?当您获得数据时,您可以映射您的真实模型。保持你的意见清洁将来会减少你的头痛。此外,您可以使用AutoMapper来帮助您。
这是一个例子,如果你认为这会对你有所帮助。 http://weblogs.asp.net/shijuvarghese/archive/2010/02/01/view-model-pattern-and-automapper-in-asp-net-mvc-applications.aspx
答案 2 :(得分:0)
模型绑定器使用名称将值绑定到模型,以及html助手,例如Html.TextBoxFor
使用lambda表达式的主体来设置名称,但是您可以使用Html.TextBox(
帮助程序自己指定您正在执行的名称
@Html.TextBoxFor(x=>x.candidateModel.tblApplicant.FirstName),
new{@Name="formModel.candidateModel.tblApplicant.FirstName"})