无法使BindAttribute Prefix属性在ASP.NET MVC3中工作

时间:2014-01-30 18:08:22

标签: c# asp.net-mvc-3 attributes model-binding

我无法使用包含带有Prefix属性的Bind属性的ActionResult方法来创建简单的MVC 3控制器/视图/模型程序。

当我从URL调用action方法时,我尝试过的一个示例可以填充参数。

以下是示例控制器后跟其视图:

//Controller
//public ActionResult PrefixExample(int number = 0)
public ActionResult PrefixExample([Bind(Prefix="okay")]int? number)
{
  return View(number);
}

//View
@model Int32?
@{
  ViewBag.Title = "Example";
}
<h2>Example</h2> 

@using (Html.BeginForm())
{
  if (@Model.HasValue)
  {
    <label>@Model.Value.ToString()</label>
  } else {
    <label>@Model.HasValue.ToString()</label>
  }
  <input type="submit" value="submit" />
}

如果我使用此网址http://localhost/MVCApp/Home/Example?okay=3,则会填充参数 number 。如果我使用此网址http://localhost/MVCApp/Home/Example?number=3,则不会填充参数。有趣的是,使用第一个网址时,当我查看源代码时,前缀 okay 不会显示。

如果我取消注释我的控制器的第一行并注释掉第二行,则情况恰恰相反: okay 的网址不会填充数字但是第二行使用 number 的网址将在控制器中填充 number

我想知道如何使以下示例接受一个url并正确设置“view source”前缀。这是一个可能的网址http://localhost/MVCApp/Home/SpecificPerson?PersonId=0&FirstName=Joe&LastName=Doe

注意,如果我从控制器方法中删除Bind属性,则上面的url将与下面的MVC应用程序一起使用。

这是我的模型/控制器/视图:

//model:    
namespace MVCApp.Models
{
    public class Person
    {
        [HiddenInput(DisplayValue = false)]
        public int PersonId { get; set; }

        public string FirstName { get; set; }
        public string LastName { get; set; }
    }
}

//controller
namespace MVCApp.Controllers
{
  public class HomeController : Controller
  {
    public ActionResult SpecificPerson([Bind(Prefix = "myPerson")]Person aPerson)
    {
        return View("SpecificPerson", aPerson);
    }
  }
}

//view
@model MVCApp.Models.Person
@{
  ViewBag.Title = "SpecificPerson";
}
<h2>SpecificPerson</h2>

@Html.EditorForModel();
<br />
@Html.EditorFor(m => m);

我希望看到上面的示例有效。任何能够告诉我为什么它不能像我期望的那样工作或者我能做些什么才能使它以这种方式工作的人将不胜感激。

提前谢谢。

1 个答案:

答案 0 :(得分:0)

我认为EditorForModel让你有点偏离轨道。如果你检查这个帮助器生成的html,你会发现它没有包装在表单中。除此之外,我认为EditorForModel不会像你想的那样为你提供服务。您也可以在不指定绑定前缀的情况下使其正常工作。

//model
public class Person
{
 public int Id {get;set;}
 public string FirstName {get;set;}
 public string LastName {get;set;}
}

//controller
public class HomeController : Controller
{
 public ActionResult Index(Person person)
 {
  if("POST".Equals(Request.HttpMethod))
  {
     //for example do some validation and redirect
  }
 return View(person);
 }
}

//view
@model Application.Models.Person //only as example use own

@using(Html.BeginForm("Index","Home", FormMethod.POST))
{

@Html.HiddenFor(x=> x.Id)

  <div>
@Html.LabelFor(x=> x.FirstName)
@Html.TextBoxFor(x=> x.FirstName)
</div>

<div>
@Html.LabelFor(x=> x.LastName)
@Html.TextBoxFor(x=> x.LastName)
</div>

<input type="submit" value="Do a post request"/>
}

此外,如果您使用像/ Home / Index?Id = 9这样的网址,并且您查看HTML代码,您会看到将有一个输入类型为= hidden且值为9的元素。您还可以使用两个操作结果用[HttpGet]和[HttpPost]作为Action的属性来分割你的逻辑。

最后我建议你查看更新版本的MVC; MVC 5已经出局......