ASP.NET HTML.BeginForm / Url.Action Url指向自身

时间:2017-08-08 20:54:10

标签: asp.net asp.net-mvc html.beginform url.action

我遇到了ASP.NET BeginForm帮助器的问题。

我尝试创建一个应该指向/Project/Delete的表单,并尝试使用以下状态来达到此目标:

@using (Html.BeginForm("Delete", "Project"))
{
}

<form action="@Url.Action("Delete", "Project")"></form>

但不幸的是,两个呈现的动作都指向/Projects/Delete/LocalSqlServer,这是浏览器中调用的网站的网址

<form action="/Project/Delete/LocalSqlServer" method="post"></form>

我真的不知道为什么渲染的动作指向自己而不是给定的路线。我已经阅读了谷歌和SO上的所有帖子(我发现),但没有找到解决方案。

这是唯一定义的路线:

routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

这是我的控制者

[HttpGet]
public ActionResult Delete(string id)
{
    return View(new DeleteViewModel { Name = id });
}

[HttpPost]
public ActionResult Delete(DeleteViewModel model)
{
    _configService.DeleteConnectionString(model);
    return null;
}

我使用的是.NET 4.6.2。

我真的很感谢你的帮助。

由于 桑德罗

1 个答案:

答案 0 :(得分:1)

事实是,这是asp.net中的一个错误,但他们拒绝承认它是一个错误,只是称之为“功能”。但是,这是你如何处理它......

以下是我的控制器的样子:

// gets the form page
[HttpGet, Route("testing/MyForm/{code}")]  
public IActionResult MyForm(string code)
{
    return View();
}

// process the form submit
[HttpPost, Route("testing/MyForm")]
public IActionResult MyForm(FormVM request)
{
    // do stuff
}

因此,在我的情况下,code会被添加,就像您使用LocalSqlServer一样。

以下是制作基本asp表单的两个版本:

@using(Html.BeginForm("myform", "testing", new {code = "" }))
{
    <input type="text" value="123" />
}


<form id="theId" asp-controller="testing" asp-action="myform" asp-route-id="" asp-route-code="">
    <input type="text" value="asdf" />

</form>

在我放置asp-route-code的位置,“代码”需要匹配控制器中的变量。与new {code = "" }相同。

希望这有帮助!