当前位置: 首页 > 知识库问答 >
问题:

当反射对象生成视图时,如何将数据从视图传递到控制器?

终翰学
2023-03-14

环境:

ASP. NET Core MVC 3.1和库。NET标准

目标:

>

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

    将此对象传递到视图。

    生成单个“表单框”,而不知道哪些属性有对象。例如。字符串=

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

    我的问题是:

    在那一刻,我可以看到前三个点,但我不能将数据传递给控制器。我试着调试它,但方法索引(intx,inty)总是用参数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; }
    }
    

    我ndex.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>
  • 共有1个答案

    印季
    2023-03-14

    查看生成的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();
            }
    

    您也可以尝试更详细地探索模型绑定。

     类似资料:
    • 在我们讨论数据库和数据模型之前,让我们先讨论一下如何将数据从控制器传递给视图。控制器类将响应请求来的URL。控制器类是给您写代码来处理传入请求的地方,并从数据库中检索数据,并最终决定什么类型的返回结果会发送回浏览器。视图模板可以被控制器用来产生格式化过的HTML从而返回给浏览器。 控制器负责给任何数据或者对象提供一个必需的视图模板,用这个视图模板来Render返回给浏览器的HTML。最佳做法是:一

    • 问题内容: 我是laravel的新手,我一直试图将表’student’的所有记录存储到一个变量,然后将该变量传递给视图,以便可以显示它们。 我有一个控制器-ProfileController,里面有一个函数: 我认为我有此代码 我收到此错误:未定义的变量:学生(View:regprofile.blade.php) 问题答案: 你能试试看吗 同时,您可以设置多个类似这样的变量,

    • 我的数据库中有两个表。它们是食物和亚食物。我想在foods模型中获得sub_foods的名称作为数组,并将其传递到create.blade.php文件,以便在表单中创建一个动态下拉框。这是我的密码, FoodsController.php create.blade.php

    • 我有一个mvc视图和一个局部视图。控制器中有一个ActionResult方法,它将返回一个PartialView。所以,我需要将ViewBag数据从ActionResult方法传递到部分视图。 这是我的控制器 在Index.cshtml视图中 Step1.cshtml局部视图 但是这是行不通的。那么,从viewpack获取数据的正确方法是什么?我想我遵循了错误的方法。请指导我。

    • 问题内容: 我是iOS和Objective-C以及整个MVC范例的新手,我坚持以下几点: 我有一个充当数据输入表单的视图,我想给用户选择多个产品的选项。产品在另一个视图上以列出,并且我启用了多个选择。 我的问题是,如何将数据从一个视图传输到另一个视图?我将把选择保留在一个数组中,但是如何将其传递回先前的数据输入表单视图,以便在提交表单时将其与其他数据一起保存到Core Data? 我到处冲浪,看到

    • 问题内容: 我想要的是将txtComments的值从View(使用jquery / ajax)传递给Controller。 问题是ajax / jquery不接受脚本标签作为字符串。意思是,当我在txtComments中输入任何脚本/ html标记时,ajax会进入错误功能,而无法进入控制器。 这是jQuery: 这是控制器: 我也试过了逃脱(注释),但是还是一样。 问题答案: 尝试使用该功能的选