2016-02-13 81 views
1

我必须下面的代码来访问值从Route.Values为什么RoutData.Values [“txtName”]会引发null参考错误?

index.cshtml与输入控件和值

@{ 
    ViewBag.Title = "Index"; 
} 

<h2>Index</h2> 

@using(Html.BeginForm("Create", "Concepts", FormMethod.Get, null)) 
{ 
    @Html.Hidden("ghia", new { d="sssd343433333355555%%%%%%%" })  
    <input type="text" name="txtName" value="dummydata1" /> 
    <input type="text" name="txtsdsdfs&&&&33adada" value="dummydata2" />  
    <input type="submit" value="New" /> 
} 
Create.cshtml

试图访问这些值以上

@{ 
    ViewBag.Title = "Create"; 
} 

<h2>Create</h2> 

@{ 
    //Routeda 
    var p1 = ViewContext.RouteData.Values["txtName"].ToString;   
} 

<p>@p1</p> 

抛出时一行Null Reference例外:

var p1 = ViewContext.RouteData.Values["txtName"].ToString(); 

我的RouteMap是

public static void RegisterRoutes(RouteCollection routes) 
     { 
      routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

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

      routes.MapRoute(
       name: "test1", 
       url: "{controller}/{action}/{txtName}/{txtsdsdfs&&&&33adada}", 
       defaults: new { controller = "Concepts", action = "Create" } 
      ); 
     } 

为什么行抛出异常,我如何解决这一问题?

+0

因为价值他们被添加为查询字符串值,而不是路由值 - 使用'var p1 = ViewContext.HttpContext.Request.QueryString.Get(“txtName”);' –

+0

@StephenMuecke好吧我困惑,当我设置RoutMap它将这些值添加到ViewContext .RouteData.Values收集权限? – zeelong

+0

不,我会加一个更多解释的答案,虽然它有点不清楚这样做的目的是什么。 –

回答

2

当您提交表单时,表单控件的名称/值对将添加为查询字符串值,而不是路由值,因为您的浏览器不了解您的路由。为了访问,那么你可以使用

var p1 = ViewContext.HttpContext.Request.QueryString.Get("txtName"); 

只有这样,才能添加使用服务器端的代码路径的值,例如

@using(Html.BeginForm("Create", "Concepts", new { txtName = "someValue }, FormMethod.Get, null)) 

将允许您访问使用ViewContext.RouteData.Values["txtName"]

+0

嗯...我如何将我的文本框值添加到表单头中的routeData对象的txtName属性? – zeelong

+0

你不能这样做(除非你在提交之前使用javascript来改变表单元素的''action''属性,这简直太疯狂了) - 这仅仅是一个例子,告诉你它唯一可能使用的服务器端代码。 –

+0

欢呼队友,但一个快速验证,在POST方法中,查询字符串被隐藏并添加到邮件正文,所以即使在POST方法中我可以使用上面的两种技术? – zeelong

相关问题