ASP.NET MVC如何从视图传递完整模型到控制器

5

我有一个视图中的这样的表

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

这些并不是模型中的所有项目,它还有一些在ui中不存在的id,并且具有仅有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

我想将完整的模型传递给控制器,以便能够从控制器的操作中发送电子邮件。还需要在用户单击发送时验证用户的电子邮件和非空主题。我应该如何做?


创建你自己的 ViewModel - Murali Murugesan
5个回答

5
如果您想要提交完整的模型,则需要在表单中包含所有模型属性。如果您不希望它们被显示出来,可以使用@Html.HiddenFor(m => m.YourPropertyName)。我在您的代码中没有看到表单标签,但我假设有一些?
您已经对模型属性进行了验证,因为您使用了[Required]数据注释,所以在将数据提交到您的控制器时,您需要检查ModelState.Valid来在服务器端检查此验证。
public ActionResult SubmitMyForm(MyModel model)
        {
            if (ModelState.IsValid)
            {
...

回复评论:

表格将会长这样:

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

错误发生的原因是在using块内,您不需要使用@前缀来编写C#代码。请参见此答案以了解详细说明。

谢谢。您能展示一下在哪里放置Html.BeginForm吗?例如,如果我将其放在@if (!string.IsNullOrEmpty(Model.CustomerName))之前,VS(或resharper)会说我不需要@,但是没有@我在运行时会出现异常。我不想破坏我的UI布局。 - Alexander
+3 你刚刚为我节省了很多时间。我一直不太清楚如何将我的值传递给 [HTTPPOST] 方法...现在它可以工作了。 - Nick

3

这些不是模型中的所有项目,它还有一些ID在UI中不存在,具有仅getter属性

对于仅有GETTER的属性 -

即使这些仅有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无障碍验证。

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


2
通常情况下,我使用TempData[] ..
在视图中:
<script>
$('form').submit(function() {
@{ TempData["FullModel"] = Model; }
});
</script>

在控制器中:

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

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
    }

0

使用强类型视图总是更好的选择。只有在表单标记下的所有内容都绑定到相应的模型时,ASP.NET才会通过其名称属性将HTML控件绑定到模型。因此,如果您希望整个模型保持完整,请将模型传递给视图,并将所有内容保留在表单标记下的隐藏字段中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接