2011-03-23 16 views
1

我有一個包裹一個jQuery日期時間選擇器一個強類型的局部視圖,如下所示:ASP.NET MVC父視圖如何溝通,其部分觀點或反之亦然

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<AkwiMemorial.Models.CalendarModel>" %>  
<script type="text/javascript"> 
    $(document).ready(function() { 
    $('#datepicker').datepicker({ 
     inline: true, 
     onSelect: function(dateText, inst) { 
     $('#SelectedDate').val(dateText); 
     $('form').trigger('submit'); }}); 
    }); 
</script> 


<% using (Html.BeginForm()) { %> 
<div> 
    <div id="datepicker"/> 
    <%= Html.HiddenFor(x => x.SelectedDate)%> 
</div> 
<% } %> 

這個局部視圖模型包含一個將代表日曆上當前選定日期的單個屬性。這種模式被定義如下:

public class CalendarModel 
    { 
     public CalendarModel() { SelectedDate = DateTime.UtcNow; }   
     public DateTime SelectedDate 
     { 
      get; 
      set; 
     } 
    } 

的想法是能夠重複使用整個Web應用程序中,這家日曆局部視圖。需要此日曆作爲局部視圖的主視圖;將它稱爲是這樣的:

<% Html.RenderAction("Calendar", "Calendar", ViewData["CalendarData"]); %> 

凡CalendarController定義索利來服務HttpPost從壓延局部視圖的請求。該CalendarController定義如下:

public class CalendarController : Controller 
    {  
     string _parentControllerName; 
     string _parentControllerCallback;   

     public ActionResult Calendar(string controllerName, string controllerCallback) 
     { 
      var model = new CalendarModel(); 
      _parentControllerCallback = controllerCallback; 
      _parentControllerName = controllerName; 
      return View(model); 
     } 

     [HttpPost] 
     public ActionResult Calendar(CalendarModel model) 
     {    
      //return View(model); 
      return RedirectToAction("parentControllerCallback", "parentControllerName", model); 
     }   
    } 

我對這個孩子的行爲問題都不允許重定向,所以我有HttpPost屬性日曆方法將失敗。儘管如此,我還是希望將來自此控制器的選定數據以某種方式傳播給父視圖的控制器,控制器然後決定如何處理所選日期。

例如,我有父新聞頁面顯示新聞和文章摘要。此日曆空間視圖作爲新聞頁面的一部分使用RenderAction呈現,如上所示,CalendarData包含NewsController名稱和我想在日曆選定數據更改後調用的回調。一旦NewsController獲得此選定日期,它將抓取選定日期的所有新聞報道並重新呈現其主要內容。

我現在面臨的主要挑戰是如何將日曆的選定數據返回到父控制器,因爲重定向限制。此外,我希望使用RouteValueDictionary從NewsController傳遞數據到CalendarController,但需要閱讀更多關於路由,看看這是否會工作。任何對此的見解都會很棒。我也試圖遵循良好的設計實踐,所以如果任何人有一個完全更好的方法來做到這一點,同時保持我的日曆控件的可重用性,那會更好。

任何建議

回答

1

看起來我正在使這更復雜的需要。我立刻用CalendarController的想法,而不是使用父視圖控制器處理後回如下:

 [HttpPost] 
     public ActionResult Index(FormCollection form) 
     { 
      var date = DateTime.Today; 
      try 
      { 
       date = DateTime.Parse(form["DateStr"]); 

      } 
      catch 
      {     
      } 

      return Refresh(date); 
     } 
1

如果您的日曆控制器做什麼,我覺得它 - 你或許應該將其轉換成HTML助手,所以你可以使用...

Html.CalendarFor(m => m.FromDate)