1

すべてのコントローラーとアクション、およびそれらに対応するロールをデータベースに保存したいと考えています。したがって、対応するコントローラーがドロップダウン リストで選択されている間に、すべてのアクションがアクションのドロップダウン リストに入力されるカスケード ドロップダウン リストを持つビューを作成しました。私は次のコードを持っています: コントローラ:

  public ActionResult Create()
    {
        var asm = Assembly.GetExecutingAssembly();
        var controllerTypes = from d in asm.GetExportedTypes() where typeof(IController).IsAssignableFrom(d) select d;
        List<SelectListItem> controllerdrop = new List<SelectListItem>();
        foreach (var item in controllerTypes)
        {
            string cName = item.Name.ToString();
            controllerdrop.Add(new SelectListItem() { Value = cName, Text = cName });
        }

        ViewBag.controller = controllerdrop;
        ViewBag.role = ivr.get_all_role();
        return View();
    }

    public ActionResult get_all_action(string ob)
    {
        Type t = Type.GetType(ob);
        MethodInfo[] mi = t.GetMethods();

        List<SelectListItem> action = new List<SelectListItem>();

        foreach (MethodInfo m in mi)
        {
            if (m.IsPublic)
                if (typeof(ActionResult).IsAssignableFrom(m.ReturnParameter.ParameterType))
                {
                    action.Add(new SelectListItem() { Value = m.Name, Text = m.Name });
                }
        }

        var List = new SelectList(action, "Value", "Text");

        return Json(List, JsonRequestBehavior.AllowGet);
    }

意見:

<script src="@Url.Content("~/Scripts/jquery-1.7.2.js")" type="text/javascript"></script>
<script type="text/javascript">
    $(document).ready(function () {
        $("#drop1").change(function () {
            var id = $(this).val();
            $.getJSON("/AssignRole/get_all_action/" + id,
                function (data) {
                    var select = $("#drop2");
                    select.empty();
                    select.append($('<option/>', {
                        value: 0,
                        text: "Select a action"
                    }));
                    $.each(data, function (index, data) {
                        select.append($('<option/>', {
                            value: data.Value,
                            text: data.Text
                        }));
                    });
                });
        });
    });    
</script>
@using (Html.BeginForm())
{
    @Html.DropDownList("Controller", ViewBag.controller as SelectList, "Select a Controller", new { id = "drop1" })

    <select id="drop2">
    </select>

    foreach (var list in ViewBag.role)
    {
    <input type="checkbox" name="role" value=@list.Name /> @list.Name
    }

    <input type="submit" value="Save" />
}

問題:

例外がスローされますType t = Type.GetType(ob);

Value cannot be null.
Parameter name: typeName
4

1 に答える 1

0

controllernameコントローラアクションでパラメータ名をに変更します。

 public ActionResult get_all_action(string controllername)
    {
        Type t = Type.GetType(controllername);
        .
        .
        .
    }

編集

controllerdrop.Add(new SelectListItem() { Value = cName, Text = cName });

これをに変更します

controllerdrop.Add(new SelectListItem() { Value = item.FullName, Text = cName });
于 2012-12-11T07:26:23.227 に答える