MVC5 如何从部分视图中执行 post?

MVC5 How to do a post from partialview?

我的局部视图:

@model Alina_2017.Models.DropDownModel

<h2>Groepen</h2>
<div>


    <div>
        @using (Html.BeginForm("SelectGroup", "~/Controllers/WerkvormController"))
        {
            @Html.DropDownListFor(x => x.selectedItem, new SelectList(ViewBag.groepen, "id", "Naam"), "Select", new { @class = "form-control" })
            <input type="submit" id="zoekgroep" value="Zoeken" />
        }
    </div>
</div>

我的主要观点:

@model Alina_2017.Models.WerkvormModel

@{
    ViewBag.Title = "Index";
}

@Html.Partial("~/Views/DropDown/Groepen.cshtml")

//More irrelevant html

我的控制器:

public ActionResult Index()
{


    ViewBag.groep1 = convertWerkvorm(db.Werkvormens.Where(f => f.GroepenWerkvormID == 1).ToList());
    ViewBag.groep2 = convertWerkvorm(db.Werkvormens.Where(f => f.GroepenWerkvormID == 2).ToList());
    ViewBag.groep3 = convertWerkvorm(db.Werkvormens.Where(f => f.GroepenWerkvormID == 3).ToList());
    setViewBags();
    return View();
}

[HttpPost]
public ActionResult SelectGroup(DropDownModel model)
{
    // the value is received in the controller.
    var selectedItem = model.selectedItem;
    Debug.WriteLine(selectedItem);
    return View("Index");
}

我收到 HTTP 错误 404.0 - 未找到。是否可以从不同的控制器调用一个动作?它处于局部视图中的原因是因为我使用了两种不同的模型+我将在多个其他视图中使用局部视图(至少在我开始工作后)。

您的控制器名称错误。

替换

@using (Html.BeginForm("SelectGroup", "~/Controllers/WerkvormController"))

@using (Html.BeginForm("SelectGroup", "Werkvorm"))

如果您在浏览器中查看您的源代码,或者在浏览器的开发工具中检查网络选项卡,您可以验证实际 post URL。

BeginForm() 方法的第二个参数只是控制器的 名称,而不是它的文件:

@using (Html.BeginForm("SelectGroup", "Werkvorm"))
{

}

您可以从任何地方post 执行任何服务器端操作。没有基于视图呈现方式的限制,因为一旦呈现所有内容,无论它来自何处,它都只是客户端标记。

作为学习练习,检查浏览器调试工具中实际呈现的标记并查看为表单创建的 URL。不管partial view怎么排,哪个controller返回view,model是什么等等...到头来都是HTML。您甚至可以手动编写一个简单的 .html 文件,其中包含一个成功 post 到服务器端 ASP.NET MVC 操作的表单。