asp.net mvc如何将完整模型从视图传递到控制器

时间:2014-01-30 10:46:05

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

我在视图中有这样的表

<table class='sendemailtable'>                
@if (!string.IsNullOrEmpty(Model.CustomerName))
{
<tr>
   <td style="font-size: 26px;">
   @Html.Label(string.Empty, Model.CustomerName)
   </td>
</tr>
}                   

<tr><td style="padding-top: 15px;">To:</td></tr>
<tr>
   <td>
   @Html.TextBoxFor(m => m.EmailTo)
   @Html.ValidationMessageFor(m => m.EmailTo);
   </td>
</tr>

<tr><td style="padding-top: 15px;">Subject:</td></tr>
<tr>
<td style="font-size: 22px;">
@Html.TextBoxFor(m => m.EmailBody)
</td>
</tr>

few more

<button style="..." type="submit">SEND</button>

</table>

这些不是来自模型的所有项目,它有一些更多的id,这些id在ui中不存在,只有一些属性只有getter

    public int OfferID;
    public int SomeOfferID;
    public int CustomerID;

    #region Email

    [Required]
    [DataType(DataType.EmailAddress)]
    [RegularExpression(@"[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,4}", ErrorMessage = "Incorrect email")]
    public string EmailTo;

    private string emailBodyDefault;
    public string EmailBody
    {
        get
        {
            if (string.IsNullOrEmpty(emailBodyDefault))
                emailBodyDefault = string.Format("Hi,{1}please take a look. Offer ID: {0}{1}{1}Thanks", SomeOfferID, Environment.NewLine);

            return emailBodyDefault;
        }

        set { emailBodyDefault = value; }
    }

    private string emailSubject;
    [Required]
    public string EmailSubject
    {
        get
        {
            if (string.IsNullOrEmpty(emailSubject))
                emailSubject = string.Format("Offer ID: {0}", SomeOfferID);

            return emailSubject;
        }

        set { emailSubject = value; }
    }

    #endregion

我想将我的模型传递给控制器​​,以便能够从控制器的动作发送电子邮件。还需要验证用户的电子邮件,以及用户点击发送时的非空主题。我怎么能这样做?

5 个答案:

答案 0 :(得分:4)

如果要提交完整模型,则需要在表单中包含所有模型属性。如果您不希望显示它们,可以使用@Html.HiddenFor(m => m.YourPropertyName)执行此操作。我在你的代码中没有看到任何表单标签,但我认为有一些吗?

您已经使用[Required] DataAnnotations对模型属性进行了验证,因此要在服务器端进行检查,您需要在将数据发布到控制器时检查ModelState.Valid。

public ActionResult SubmitMyForm(MyModel model)
        {
            if (ModelState.IsValid)
            {
...

对评论的回应:

表单看起来像这样:

@using (Html.BeginForm())
{
    <table>
    ...
    </table>
}

发生错误是因为在using块内,您不需要使用@为C#代码添加前缀。有关说明,请参阅this answer

答案 1 :(得分:2)

  

这些并非所有来自模型的项目,它都有一些更多的ID   目前在ui,有一些只有getter的属性

仅适用于GETTERS的属性

只有getter的属性,即使它们不是视图的一部分,它们仍然会从POST中保留它们的值。

例如,如果您有模型 -

public class MyModel1
{
    public string name { get { return "Rami"; } }
    public string email { get; set; }
}

你的控制器动作 -

public ActionResult Index()
{
    MyModel1 m = new MyModel1();
    m.email = "ramilu";
    return View(m);
}

public ActionResult submit(MyModel1 m)
{
    return null;
}

最后你的观点 -

@using (Html.BeginForm("submit", "New", FormMethod.Post))
{
    @Html.LabelFor(model => model.email, new { @class = "control-label col-md-2" })
    @Html.EditorFor(model => model.email)
    @Html.ValidationMessageFor(model => model.email)
    <input type="submit" value="Create" class="btn btn-default" />
}

当您点击提交按钮时,即使您在视图中没有名称属性,它仍将保持其值。

enter image description here

适用于使用GETTERS和SETTERS的属性

这些属性必须作为隐藏字段包含在表单中(或者可能通过在服务器上使用cookie或会话或缓存等通过其他方式)。否则他们就不会坚持自己的价值观。

例如 -

public class MyModel1
{
    public string name { get; set; }
    public string email { get; set; }
}

控制器操作 -

public ActionResult Index()
{
    MyModel1 m = new MyModel1();
    m.email = "ramilu";
    m.email = "email";
    return View(m);
}

public ActionResult submit(MyModel1 m)
{
    return null;
}

索引视图 -

@using (Html.BeginForm("submit", "New", FormMethod.Post))
{
    @Html.LabelFor(model => model.email, new { @class = "control-label col-md-2" })
    @Html.EditorFor(model => model.email)
    @Html.ValidationMessageFor(model => model.email)
    @Html.HiddenFor(model => model.name);
    <input type="submit" value="Create" class="btn btn-default" />
}

当您点击提交按钮时,您将获得所有属性值。在这里,我使用了隐藏的字段 -

enter image description here

  

还需要验证用户的电子邮件,以及用户时的非空主题   点击发送。我怎么能这样做?

您可以使用JQuery Unobstructive Validation with Model Data Annotations.

简单Model Validation in ASP.Net MVC (server side)

答案 2 :(得分:2)

通常,我使用TempData [] ..

在视图中:

<script>
$('form').submit(function() {
@{ TempData["FullModel"] = Model; }
});
</script>
控制器中的

[HttpPost]
public void Controller()
{
    YourModel model = (YourModel) TempData["FullModel"];
}

答案 3 :(得分:0)

您可以使用强类型视图和几个步骤来执行此操作

    /// Use Strongly typed view (Type @Model yourModel)
    /// Use @HTML.BeginForm and a button with type="Submit"

    [HttpPost]
    public void Controller(YourModel dodel)
    {
        // Here you will get data in model
    }

答案 4 :(得分:0)

使用强类型视图总是更好。只有form标签下的所有东西都绑定到相应的模型,asp.net将html控件绑定到由name属性建模。因此,如果您希望整个模型完整无缺,请通过模型查看并将所有内容保存在表单标记下的hiddenfield中。