使用工厂调用不同的ActionResult?

时间:2017-08-08 08:48:09

标签: c# .net asp.net-mvc

我的视图中有一个下拉菜单,类似于“全部,已读/未读,类别”。该视图为用户呈现通知。

在控制器中有一个默认的ActionResult来显示所有,一个用于读取/未读取,一个用于显示类别。

我想使用工厂根据上面选择的下拉列表调用其中一个方法(即未读的选定调用未读ActionResult,原因是我不想使用switch / if语句来维护可维护的代码,我只是不确定实施。

1 个答案:

答案 0 :(得分:1)

为什么不使用正确的网址作为SelectListItem的值,并使用此值重定向/加载内容?

在GET用例的ViewModel中:

var urlHelper = new UrlHelper(HttpContext.Current.Request.RequestContext);

var availableOptions = new List<SelectListItem> {
    new SelectListItem {
        Text = "All",
        Value = urlHelper.Action("GetAll", "Notifications"),
        Selected = true
     },
     new SelectListItem {
        Text = "Read/Unread",
        Value = urlHelper.Action("GetReadOrUnread", "Notifications"),
        Selected = false
     },
     new SelectListItem {
        Text = "Categories",
        Value = urlHelper.Action("GetCategories", "Notifications"),
        Selected = false
     }
};

在你的剃须刀视图中:

@Html.DropDownListFor(m => m.SelectedView, Model.AvailableOptions)

<script>
$(document).ready(function() {
    // use @Html.IdFor so this does not break 
    // if you rename the SelectedView property in the ViewModel
    var dropdown = $('#@Html.IdFor(m => m.SelectedView)');

    dropdown.on('change', function () {
        // this gets the "value" attribute of the selected option
        var selectedUrl = $('option:selected', dropdown).val();
        $.ajax({
            url: selectedUrl, 
            success: function(result){ /* insert retrieved HTML into DOM ... */ }
        });
    });
});
</script>