繁体   English   中英

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

[英]asp.net mvc how to pass full model from view to controller

我在视图中有这样的表

<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在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

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

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

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

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

回复评论:

表单看起来像这样:

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

发生错误是因为在using块内部,您不需要使用@前缀C#代码。 请参阅此答案以获得解释。

这些不是来自模型的所有项目,它有一些更多的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" />
}

当你点击提交按钮时,即使你没有视图中的name属性,它仍将保持其值。

在此输入图像描述

对于有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" />
}

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

在此输入图像描述

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

您可以将JQuery无阻碍验证与模型数据注释一起使用。

ASP.Net MVC中的简单模型验证(服务器端)

通常,我正在使用TempData [] ..

在视图中:

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

在控制器中:

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

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

    /// 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
    }

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM