2014-01-30 32 views
0

我無法使用ActionResult方法制作簡單的MVC 3控制器/視圖/模型程序,該方法包括具有Prefix屬性的Bind屬性。無法使BindAttribute前綴屬性在ASP.NET MVC3中工作

當我從URL調用操作方法時,我嘗試嘗試的一個示例可能會填充該參數。

下面是示例控制器隨後視圖:

//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" /> 
} 

如果使用這個URL http://localhost/MVCApp/Home/Example?okay=3參數,,被填充。如果我使用此網址http://localhost/MVCApp/Home/Example?number=3,則不填充該參數。有趣的是,與第一個網址,當我查看源代碼時,前綴好吧不顯示。

如果我取消我的控制器的第一行和註釋掉第二行,情況正好相反:與URL 沒關係將不填充但使用將填充數第二網址控制器中的

我想知道如何讓下面的例子接受一個url並正確設置「view source」前綴。這裏有一個可能的網址http://localhost/MVCApp/Home/SpecificPerson?PersonId=0&FirstName=Joe&LastName=Doe

請注意,如果我從控制器方法中刪除綁定屬性,上面的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); 

我想看看上面的例子中工作。任何人都可以告訴我爲什麼它不能如我所期望的那樣工作,或者我能做些什麼來使它以這種方式工作,我們將不勝感激。

預先感謝您。

回答

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"/> 
} 

另外,如果你使用URL像/首頁/指數α-ID = 9,你看的HTML代碼,你會看到有將與輸入類型元素=隱藏的9.你能值還可以使用兩個動作結果將您的邏輯與[HttpGet]和[HttpPost]作爲Action的屬性分開。

最後,我建議您查看MVC的較新版本; MVC 5已經出...