C#MVC中的控制器到控制器通信

时间:2018-03-29 05:02:14

标签: c# asp.net-mvc

我想在区域控制器中使用状态控制器列表。有没有更好的想法。 我试过一个正在运作的

我使用构造函数注入将此代码放在区域控制器中。

在这种情况下,整个代码需要放在区域控制器中。 有没有办法减少代码。一个更好的方法?

   #region StateDropDown
    public List<SelectListItem> StateDropDown()
    {
        List<SelectListItem> selectListItem = new List<SelectListItem>();
        List<StateViewModel> stateList = Mapper.Map<List<State>, List<StateViewModel>>(_stateBusiness.GetStateForSelectList());
        if (stateList != null)
            foreach (StateViewModel state in stateList)
            {
                selectListItem.Add(new SelectListItem
                {
                    Text = state.Description,
                    Value = state.Code.ToString(),
                    Selected = false
                });
            }
        return selectListItem;
    }
    #endregion StateDropDown

3 个答案:

答案 0 :(得分:0)

我不知道更好,但你可以使用linq Mapper.Map<List<State>, List<StateViewModel>>(_stateBusiness.GetStateForSelectList())? .Select(state => new SelectListItem { Text = state.Description, Value = state.Code.ToString(), Selected = false }))?.ToList() ?? List<SelectListItem>(); 大大缩短这一点。

URLSession

答案 1 :(得分:0)

这就是“可重用性”一词的发明之处。将代码放在另一个文件中,并从任意数量的控制器调用它,如下面的代码。

//StateBusiness.cs
public class StateBusiness
{
    public List<SelectListItem> GetStatesForDropdown()
    {
        //your logic here
        return new  List<SelectListItem>();
    }
}

//StateController.cs
public class StateController : Controller
{
    var state = new StateBusiness();

    public ActionResult Index()
    {
        //call your code here 
        var states = state.GetStatesForDropdown();
        //and do whatever you want
        ViewBag.states = states;
        return View();
    }
}

//DistrictController.cs
public class DistrictController : Controller
{
    var state = new StateBusiness();

    public ActionResult Index()
    {
        //call it from here just the same
        var states = state.GetStatesForDropdown();
        ViewBag.states = states;
        return View();
    }
}

答案 2 :(得分:0)

如果你使用核心一个选项可能是将它从控制器上移开并使用TagHelper这将允许你使用简单属性state-items将选项注入到标记中,从而减少控制器依赖性并保持这个陈述ViewBag,同时更可重复使用。

以下是视图中的外观:

<select asp-for="State" state-items />

TagHelper:

[HtmlTargetElement("select", Attributes = "state-items")]
public class StateItemsTagHelper : TagHelper {
    private readonly StateBusiness _stateBusiness;

    [HtmlAttributeName("asp-for")]
    public ModelExpression For { get; set; }

    public StateItemsTagHelper(StateBusiness stateBusiness) {
        this._stateBusiness = stateBusiness;
    }

    public override void Process(TagHelperContext context, TagHelperOutput output) {
        content.TagMode = TagMode.StartTagAndEndTag;

        var value = For?.Model as string;

        var items = _stateBusiness.GetStateForSelectList()?.Select(state => new SelectListItem {
             Text = state.Description,
             Value = state.Code.ToString(),
             Selected = value == state.Code.ToString()
        })) ?? Enumerable.Empty<SelectListItem>();

        foreach(var item in items) {
            output.Content.AppendHtml(item.ToHtmlContent());
        }
    }
}

对于可重用性item.ToHtmlContent是一种扩展方法:

public static IHtmlContent ToHtmlContent(this SelectListItem item) {
    var option = new TagBuilder("option");
    option.Attributes.Add("value", item.Value);
    if(item.Selected) {
        option.Attributes.Add("selected", "selected");
    }
    option.InnerHtml.Append(item.Text);
    return option;
}