2013-07-23 25 views
0

我请求ASP.NET MVC使用URL这样的控制器:ASP.NET MVC解码Html.BeginForm URL

http://mysite.com/controller/myaction/Invalid%23name%25x 

其中Invalid%23name%25x

public ActionResult MyAction(string id) { 
    return View(); 
} 

的GET参数请求工作正常。

MyAction看法是这样的:

@using (Html.BeginForm()) { 
    ... 
    <input name="Save" type="submit" value="Save" /> 
} 

生成的HTML是:

<form action="/Controller/MyAction/Invalid#name%x" method="post"> 
    ... 
    <input name="Save" type="submit" value="Save" /> 
</form> 

当我点击 “保存”,形式被发布和POST请求转到

http://mysite.com/controller/myaction/Invalid#name%x 

即初始URL被解码。这意味着POST操作只接收参数的第一部分 - “无效”

[HttpPost] 
public ActionResult MyAction(string id, ...) { 
    return View(); 
} 

如何防止Html.BeginForm从为了保全初始状态解码初始网址吗?

+1

什么是生成的HTML? – SLaks

+0

Omnituens

+0

这看起来像是MVC中的一个错误。哪个版本? – SLaks

回答

1

试试这个,通过ActionNameController表单中的

@using (Html.BeginForm("ActionName", "Controller")) { 
+0

太棒了!有用!但你能告诉我为什么吗? – Omnituens

0

我个人建议你不要使用id为字符串,因为正如你所看到的字符串中可以有很多的话..让这意味着什么通常它(数值)。

使用类似http://mysite.com/controller/myaction?Name=Invalid%23name%25x

public ActionResult MyAction(string Name) { 
    return View(); 
} 

我想这会为你工作..

+0

我的目的是使RESTful URL像域/控制器/动作/ [人类可读实体名称],以使它们为人类提供信息并避免附加参数。 – Omnituens

+0

@Omnituens我认为那么你应该使用_或 - 代替空间..正如你可以看到在堆栈溢出Uri .. – dotNETbeginner