【问题标题】:How to pass data from View to Controller, when View was genereted by reflection object?当 View 由反射对象生成时,如何将数据从 View 传递到 Controller?
【发布时间】:2020-07-15 10:25:52
【问题描述】:

环境:

ASP.NET Core MVC 3.1 和库 .NET Standard

目标:

  1. 从 DLL 创建对象(dll 可以随时更改),没有常量结构,例如。 class Obj{ int, string, string},但另一个 dll 将具有类 Obj {int, int, int}。

  2. 将此对象传递给查看。

  3. 在不知道哪些属性具有对象的情况下生成单个“表单框”。前任。 string => 文本框,bool => 复选框等

  4. 将此数据传递给方法/控制器/api。

我的问题:

在那一刻我可以前三点,但我不能将数据传递给控制器​​。我试过调试它,但是方法 Index(int x, int y) 总是用参数 x = 0, y = 0 调用。

代码:

HomeController.cs

    [HttpGet]
    public IActionResult Index()
    {
        Assembly dllAssembly = Assembly.LoadFile(Environment.CurrentDirectory + 
                                                 "\\TestLib.dll");
        Type dllType = dllAssembly.GetType("TestLib.TestModel");
        tempObj = Activator.CreateInstance(dllType);

        ViewBag.Message = tempObj;
        return View();
    }
    [HttpPost]
    public IActionResult Index(int x, int y)
    {
        Assembly dllAssembly = Assembly.LoadFile(Environment.CurrentDirectory + 
                                                 "\\TestLib.dll");
        Type dllType = dllAssembly.GetType("TestLib.TestModel");
        tempObj = Activator.CreateInstance(dllType);

        dllType.GetProperty("X").SetValue(tempObj, x);
        dllType.GetProperty("Y").SetValue(tempObj, y);

        ViewBag.Message = tempObj;
        return View();
    }

TestModel.cs

public class TestModel
{
    [Range(0, 10)]
    public int X { get; set; }
    [Range(0, 10)]
    public int Y { get; set; }
}

Index.cshtml

@{
    ViewData["Title"] = "Home Page";
    var data = ViewBag.Message;
}

@using (@Html.BeginForm())
{
    @Html.EditorFor(model => data)
    <input type="submit" />
}

生成的 html

<form action="/" method="post">
<div class="editor-label">
<label for="data_X">X</label>
</div>
<div class="editor-field">
<input class="text-box single-line" data-val="true" data-val-range="The field X must be between 0 and 10." data-val-range-max="10" data-val-range-min="0" data-val-required="The X field is required." id="data_X" name="data.X" type="number" value="0"> 
<span class="field-validation-valid" data-valmsg-for="data.X" data-valmsg-replace="true"></span>
</div>
<div class="editor-label">
<label for="data_Y">Y</label>
</div>
<div class="editor-field"><input class="text-box single-line" data-val="true" data-val-range="The field Y must be between 0 and 10." data-val-range-max="10" data-val-range-min="0" data-val-required="The Y field is required." id="data_Y" name="data.Y" type="number" value="0"> 
<span class="field-validation-valid" data-valmsg-for="data.Y" data-valmsg-replace="true"></span>
</div>
<input type="submit">
<input name="__RequestVerificationToken" type="hidden" value="deleted">
</form>

【问题讨论】:

    标签: c# asp.net-mvc asp.net-core reflection parameter-passing


    【解决方案1】:

    查看您生成的 html,您的控制器似乎需要接受参数“data.X”和“data.Y”,由于显而易见的原因,这不适用于参数名称。

    您可以通过更改您的方法以接受IFormCollection 来获取批量表单数据:

    [HttpPost]
            public IActionResult Index(IFormCollection collection)
            {
                Assembly dllAssembly = Assembly.LoadFile(Environment.CurrentDirectory + 
                                                     "\\TestLib.dll");
                Type dllType = dllAssembly.GetType("TestLib.TestModel");
                tempObj = Activator.CreateInstance(dllType);
    
                dllType.GetProperty("X").SetValue(tempObj, int.Parse(collection["data.X"]));
                dllType.GetProperty("Y").SetValue(tempObj, int.Parse(collection["data.Y"]));
    
                ViewBag.Message = tempObj;
                return View();
            }
    

    您也可以尝试更详细地探索model binding

    【讨论】:

      猜你喜欢
      • 2019-06-15
      • 2020-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-24
      • 1970-01-01
      相关资源
      最近更新 更多