2010-02-01 53 views
0

我有我的抽象BaseControlller像這樣的MVC動作(這個動作在所有繼承控制器是常見的):ASP.NET MVC行動可選PARAMS

// 
    // GET: /controller/RenderForm/{formType} 
    [Authorize(Roles = "Administrators")] 
    public ActionResult RenderForm(FormType formType, BaseContentObject contentObject) 
    { 
     string constructPartialViewName = RouteData.Values["controller"] + "-" + formType + "Form"; 
     return PartialView(constructPartialViewName, contentObject); 
    } 

與這條路線:

 routes.MapRoute(
      "ContentObjectsFormRendering", 
      RouteType.Regular, 
      "{controller}/RenderForm/{formType}", 
      new {controller = "", action = "RenderForm", formType = ""}, null 
      ); 

的問題出現時,我讓瀏覽器請求,如:

〜/頁/ RenderForm /創建

這是呈現創建表單的請求。 這是通過瀏覽器完成的 - 例如輸入URL。這裏沒有BaseContentObject實例(請注意,這不能通過瀏覽器提供,因爲在編輯的情況下它總是從數據存儲區中取出),我認爲這是困擾他的原因。

(唯一的例外是:無法創建抽象類。)

但是像這樣執行的RenderAction時:

<% 
     Html.RenderAction("RenderForm", ViewData.Model.ContentType.ToString(), new {formType = FormType.Edit, contentObject = ViewData.Model}); %> 

它呈現與BaseContentObject實例細節的編輯形式(提供通過ViewData)就好了

如果我從動作中刪除BaseContentObject contentObject參數然後渲染創建工作正常,但然後我不能提供編輯的第二種情況下的內容對象參數。

我該如何解決這個問題?

+0

你能提供例外嗎? – dariol 2010-02-01 11:42:18

回答

1

由於RenderForm是常見的(在基本控制器中),因此MVC使用此方法的簽名來實例化參數。這是這樣的:

  • 行動RenderForm(FormType formType,BaseContentObject contentObject)
  • 有沒有像 「contentObject.Property」 表單數據從而MVC需要實例contentObject
  • 一個類型contentObject是BaseContentObject
  • BaseContentObject不能實例化,因爲它是抽象的

你的問題是,你認爲如果你用不同的/特定的內容覆蓋RenderForm對象參數類型,那麼將使用新的參數類型 - 但從我看到這裏是錯誤的。基本方法簽名將被使用。

解決方案:

  • 覆蓋DefaultModelBinder和調整實例存在;不過,我不確定是否可以檢測到實際的動作/參數類型;
  • 不要使用通用的基礎RenderForm操作;將所需的通用功能提取到受保護的基本方法(例如DoRenderForm)中,並從實際操作中調用它。
+0

我已經解決了這個問題,用BaseContentObject參數替換string類型的內容slug參數,然後使用這個字符串從數據存儲中取出對象,或者如果它爲null或空,我只是重定向到Create視圖。你說得對,問題在於抽象類被用作方法參數。 – mare 2010-02-01 20:26:06