ASP.NET MVC父视图如何与其部分视图进行通信,反之亦然

时间:2011-03-23 02:19:59

标签: asp.net-mvc

我有一个包含jQuery日期时间选择器的强类型部分视图,如下所示:

<%@ 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属性的Calendar方法将失败。尽管如此,我希望来自此控制器的选定数据以某种方式传播到父视图的控制器,然后控制器决定如何处理所选日期。

例如,我的父新闻页面显示了新闻和文章摘要。此日历空间视图使用上面发布的RenderAction呈现为新闻页面的一部分,其中CalendarData包含NewsController名称和我想在日历选定数据更改后调用的回调。一旦NewsController获得此选定日期,它将获取所选日期的所有新闻文章并重新呈现其主要内容。

我现在面临的主要挑战是如何通过重定向限制将日历的选定数据恢复到父控制器。此外,我希望使用RouteValueDictionary将数据从NewsController传递到CalendarController,但需要阅读更多关于路由的信息,看看这是否有效。对此的任何见解都会很棒。我也试图遵循良好的设计实践,所以如果有人有更好的方法来做到这一点,同时保持我的日历控件的可重用性,那就更好了。

任何建议

2 个答案:

答案 0 :(得分:1)

看起来我正在变得更加复杂。我抛弃了使用CalendarController的想法,而是使用父视图的控制器来处理回发,如下所示:

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

            }
            catch 
            {                
            }

            return Refresh(date); 
        } 

答案 1 :(得分:1)

如果您的日历控制器按我认为的那样做 - 您可能应该将其转换为Html Helper,以便您可以使用......

Html.CalendarFor(m => m.FromDate)