HttpPost创建后的填充字段 - 使用输入对象为空

时间:2017-01-29 22:26:02

标签: c# asp.net asp.net-mvc

我正在学习ASP.NET MVC 5.我创建了一个View“Create”。但是我没有使用Razor来生成输入字段,我使用纯HTML的输入。

Create.cshtml

@model MyProject.Product

<h2>Create Product</h2>

<form method="post">

    Description: <br /> 
    <input type="text"  name="Description" id="Description"/> <br />
    ValueType: <br />
    <input type="text" name="ValueType" id="ValueType"/>
    <br />
    <input type="submit" name="btSend"/>

</form>

我的控制器:

   public ActionResult Create()
        {            
            return View();
        }

        [HttpPost]
        public ActionResult Create(Product product)
        {
            if (ModelState.IsValid)
            {                
                db.Product.Add(product);                
                db.SaveChanges();                
                return RedirectToAction("Index");

            }
            else
            {
                return View(product);
            }

    It works fine. I can create new products.

但我需要在模型中使用一些带有Annotations的服务器端验证。 所以,我想发送数据,如果模型无效,请返回使用值创建。我知道如何放置验证消息。所以,我试过这个:

  @model MyProject.Product

<h2>Create Product</h2>

<form method="post">

    Description: <br /> 
    <input type="text"  name="Description" id="Description" value="@Model.Description"/> <br />
    ValueType: <br />
    <input type="text" name="ValueType" id="ValueType" value="@Model.ValueType"/>
    <br />
    <input type="submit" name="btSend"/>

</form>

如何将纯输入与html绑定到模型?

为什么空值?

非常感谢。

2 个答案:

答案 0 :(得分:0)

如果您不想使用razor based form approach,则可以将显示验证消息与Viewbag/ViewData一起使用。

   [HttpPost]
    public ActionResult Create(Product product)
    {
        if (!ModelState.IsValid)
        {   
            //if you want to get validation message from ModelState itself, you can query from Modelstate :
           string message = string.Join(" , ", ModelState.Values
                              .SelectMany(v => v.Errors)
                               .Select(e => e.ErrorMessage));
            ViewData["ValidationMessage"] = "Validation Message";// you can use above variable message here
            return View(product);
        }
     // your other implementation
    }

您的观点应该是这样的:

@model MyProject.Product

<h2>Create Product</h2>

<form method="post">
    <div class="error-message">@ViewData["ValidationMessage"]</div>
    Description: <br /> 
    <input type="text"  name="Description" id="Description" value="@Model.Description"/> <br />
    ValueType: <br />
    <input type="text" name="ValueType" id="ValueType" value="@Model.ValueType"/>
    <br />
    <input type="submit" name="btSend"/>

</form>

但是,如果您被允许,我建议您使用razor based form approach

答案 1 :(得分:0)

我想你可能会误解剃刀视图引擎。 Pages 2.0和3.0(razor)没有以任何方式进行数据绑定。它使用html帮助器模拟它,但这不是本机剃刀数据绑定。看看助手背后的代码(https://aspnetwebstack.codeplex.com/SourceControl/latest#src/System.Web.Mvc/Html/DefaultEditorTemplates.cs),你会看到他们正在执行你希望的工作。