html.TextBoxFor和html.Textbox,POSTing值,参数模型

MrJ*_*rJD 4 post controller razor asp.net-mvc-3

好吧,伙计们,需要一些帮助!

我正在使用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);
    }
Run Code Online (Sandbox Code Playgroud)

现在......
我无法在post方法的formModel参数中获取值.

这工作(意味着我可以看到值)但是很繁琐,因为我必须准确地写出每个字段在字符串中的位置:

@Html.TextBox("formModel.candidateModel.tblApplicant.FirstName", Model.candidateModel.tblApplicant.FirstName)
Run Code Online (Sandbox Code Playgroud)

它呈现如下:

<input name="formModel.candidateModel.tblApplicant.FirstName" id="formModel_candidateModel_tblApplicant_FirstName" type="text" value="Graeme"/>
Run Code Online (Sandbox Code Playgroud)

这不起作用:

@Html.TextBoxFor(c => c.candidateModel.tblApplicant.FirstName)
Run Code Online (Sandbox Code Playgroud)

它呈现如下:

<input name="candidateModel.tblApplicant.FirstName" id="candidateModel_tblApplicant_FirstName" type="text" value="Graeme"/>
Run Code Online (Sandbox Code Playgroud)

现在我假设问题在于id的差异

所以请回答我:

  1. 我是以正确的方式来做这件事的
  2. 为什么textboxfor没有得到正确的值/ id,以及如何让它获得正确的值/ id以便我可以在POST中检索它(如果这甚至是问题)?
  3. 此外,似乎textboxfor是限制性的,如果你有一个日期时间,你如何使用.toshortdate()方法?这让我觉得textboxfor对我没用.

快速澄清:当我说textboxfor无法正常工作时,它会在我获取表单时获取值.所以他们填写,但在POST /提交,我无法在参数中的formModel中看到它们.

另一方面说明:
没有html助手工作,这就是问题所在.它们也没有出现在模型状态中.


谢谢大家的帮助

答案:
html.TextBoxFor和html.Textbox,POSTing值,参数模型

在我的视图中,这是一个问题,我在这个答案中用片段替换了所有代码并且它有效.

再次感谢你

Dar*_*rov 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; }
}
Run Code Online (Sandbox Code Playgroud)

控制器:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

视图:

@model FormModel
@using (Html.BeginForm())
{
    @Html.EditorFor(c => c.candidateModel.tblApplicant.FirstName)
    <button type="submit">OK</button>
}
Run Code Online (Sandbox Code Playgroud)

此外,似乎textboxfor是限制性的,如果你有一个日期时间,你如何使用.toshortdate()方法?这让我觉得textboxfor对我没用.

我同意这TextBoxFor是限制性的.这就是为什么我会建议你总是使用EditorFor而不是TextBoxFor.它允许您使用[DisplayFormat]属性和voilà 简单地装饰您的视图模型属性.你得到任何你喜欢的格式.

例如:

public class MyViewModel
{
    [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
    public DateTime CreatedAt { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

并在视图中:

@model MyViewModel
@Html.EditorFor(x => x.CreatedAt)
Run Code Online (Sandbox Code Playgroud)

将完全按照您的预期格式化日期.