Asp.net mvc 如何在MVC视图中传递模型

Asp.net mvc 如何在MVC视图中传递模型,asp.net-mvc,asp.net-mvc-4,Asp.net Mvc,Asp.net Mvc 4,我想将模型从表单传递到控件,并在同一视图中显示其他模型。我该怎么做?我的主要问题是:如何在ViewData[“Success”]中发送到testAcc actionresult、model CommentModel和显示文本 这是我的密码: @model XYZ.Models._ideaDetailsWrapper @using XYZ.Tools <article> <h2>@Model.idea.Tilte</h2> <

我想将模型从表单传递到控件,并在同一视图中显示其他模型。我该怎么做?我的主要问题是:如何在
ViewData[“Success”]
中发送到testAcc actionresult、model CommentModel和显示文本

这是我的密码:

    @model XYZ.Models._ideaDetailsWrapper
    @using XYZ.Tools   
<article>
    <h2>@Model.idea.Tilte</h2>

<table><tr><td>
<p>
    Author: <b>@UserTools.getUser(Model.idea.AuthorID).UserName</b><br />
    Add date: @Model.idea.AddDate<br />
    Category: @IdeasTools.getCategoryName(Model.idea.CategoryID)<br />
</p></td>
</tr></table>

<p><b>Content:</b><br />
    @Model.idea.Content</p>

<br /><br />

// HERE - ADD comment

    @using (Html.BeginForm("testAcc", "Ideas", FormMethod.Post))
    { 
            <h4>Add comment:</h4>

            @Html.LabelFor(m => m.addComment.Content)
            @Html.EditorFor(m => m.addComment.Content)<br />
        <input type="submit" value="SendEmails" />
    }

@ViewData["Success"]

一种方法是使用局部视图

Details.cshtml

@model XYZ.Models._ideaDetailsWrapper
...
// HERE - ADD Comment
<div id="comment-form">
@Html.Partial("_CommentForm", Model.addComment)
</div>

@Model.message
// add validation javascript to this view
使用
TempData
通过重定向传递消息。在使用前直接加载页面时,您将检查
TempData[“Message”]
操作中是否存在
Details

编辑:对于验证,只需将验证javascript添加到详细信息视图,并将
ValidationSummary
添加到部分视图

编辑2:此方法会因验证和错误处理而失效。为此,需要AJAX替换表单div,而无需重新加载整个页面

您需要截取正常表单提交,并使用AJAX自己处理它

$("form").on("submit", function(event) {
    event.preventDefault();
    $.ajax({
        url: "/Ideas/testAcc",
        type: "POST",
        data: $("form").serialize()
    })
    .done(function(partialViewHtml) {
        $("#comment-form").html(partialViewHtml);
    });
});
你的行为变得

[HttpPost]
public ActioNResult testAcc(CommentModel model)
{
    if (ModelState.IsValid)
    {
        ...
        return RedirectToAction("Details", "Ideas", new { id = model.Idea.Id });
    }
    return PartialView("_CommentForm", model);
}

RedirectToAction要求浏览器将请求重定向到其他位置,因此浏览器请求新的URL,这是一个单独的请求,因此它不会从第一个请求中了解有关模型或视图数据的任何信息。但是,当我调试时,testAcc方法中的变量
CommentModel
始终为空。在哪里?testAcc方法中没有(除非您没有向我们显示缺少的位),如果它在视图中,那是因为,正如我所说,它是来自浏览器的一个单独请求,没有关于以前请求的信息。在没有模型的情况下(仅从文本框传递一个字符串),此方法可以很好地工作(testAcc)。但对于通过模型,存在一些问题。我在
RedirectToAction
之前停止调试程序。根据您的代码更改:视图的模型和TestAc方法中的模型不匹配,并且无法强制一个到另一个(属性具有不同的名称),因此它不知道该做什么,也无法匹配它们。如果您查看实际生成的HTML,您将看到EditorFor生成的内容将被命名为类似“addCommant_内容”,但POST操作需要一个名为“内容”的东西,谢谢!现在它起作用了。但是,当单击
时,如何验证模型中的字段?来自模型的消息,如:
[必需]
等?将验证脚本添加到
详细信息
视图
@Html.ValidationSummary()
-这一个,是吗?还是不行。在输入点击时,页面在没有验证的情况下重新加载..嗯,不确定,因为我通常用AJAX这样做。尝试添加一个
HttpGet testAcc
,该
返回PartialView(“\u CommentModel”,model)
。然后,当您在
HttpPost
中验证失败时,只需
返回视图(模型)
。在
[HttpPost]
中,当我放置
返回视图(模型)
时,我得到错误
视图“testAcc”或其主视图未找到,或者没有视图引擎支持搜索的位置
。但是当我放置
返回视图(“CommentForm”,test)时-它工作正常,验证运行正常,但它只显示此partialview,没有rest
详细信息
元素。你知道为什么以及如何解决它吗?当做
@model XYX.Models.CommentModel
@{
    Layout = null;
}

@using (Html.BeginForm("testAcc", "Ideas", FormMethod.Post))
{ 
      @Html.ValidationSummary(true)
        <h4>Add comment:</h4>

        @Html.LabelFor(m => m.Content)
        @Html.EditorFor(m => m.Content)
        @Html.ValidationMessageFor(m => m.Content)<br />
    <input type="submit" value="SendEmails" />
}
[HttpPost]
[Authorize]
public ActionResult testAcc(CommentModel model)
{
    string abs = model.Content;

    TempData["Message"] = "Working!";

    // ADD TO DATABASE
    return RedirectToAction("Details", "Ideas", new { id = model.Idea.Id });
}

[HttpGet]
[Autorize]
public ActionResult Details(int id)
{
    var ideaModel = dbStore.GetIdea(id);  // however you do this

    var model = new _ideaDetailsWrapper {
        idea = ideaModel,
        addComment = new CommentModel(),
        message = TempData["Message"]
        ...
    };
    return View(model);
}
$("form").on("submit", function(event) {
    event.preventDefault();
    $.ajax({
        url: "/Ideas/testAcc",
        type: "POST",
        data: $("form").serialize()
    })
    .done(function(partialViewHtml) {
        $("#comment-form").html(partialViewHtml);
    });
});
[HttpPost]
public ActioNResult testAcc(CommentModel model)
{
    if (ModelState.IsValid)
    {
        ...
        return RedirectToAction("Details", "Ideas", new { id = model.Idea.Id });
    }
    return PartialView("_CommentForm", model);
}