【问题标题】:Why is my Viewmodel that I am returning to my POST method in MVC returning a null ViewModel为什么我要返回到 MVC 中的 POST 方法的 Viewmodel 返回 null ViewModel
【发布时间】:2021-05-29 19:39:59
【问题描述】:

我真的以为我明白自己在做什么,但是就这样吧。我决定在我的视图中需要更多属性,所以我创建了一个名为 ViewDataset 的 ViewModel 并替换了视图中的原始数据集模型。在我的 HttpGet TestDataset 上,视图模型正确地填充了来自视图模型的数据:

我正在工作的原始数据集如下:

public class Dataset
    {
        public int Dataset_ID { get; set; }
        public int Category_ID { get; set; }
        public string Provider { get; set; }
        public string Name { get; set; }
        public string Institution { get; set; }
        public string Description { get; set; }
        public string Location { get; set; }
        public bool Domestic { get; set; }
        public bool International { get; set; }
        public bool Includes_PHI { get; set; }
        public bool PHI_Limited { get; set; }
        public bool Includes_PIL { get; set; }
        public bool PIL_Limited { get; set; }
        public bool Citation_Requirements { get; set; }
        public string Citation_Comments { get; set; }
        public Nullable<System.DateTime> Availability_Beg_DT { get; set; }
        public Nullable<System.DateTime> Availability_End_DT { get; set; }
        public bool Subscription_Renewal { get; set; }
        public Nullable<System.DateTime> Subscription_Renewal_DT { get; set; }
        public bool Retention_Expiry { get; set; }
        public Nullable<System.DateTime> Retention_Expiry_DT { get; set; }
        public bool Data_Destruction { get; set; }
        public Nullable<System.DateTime> Data_Destruction_DT { get; set; }
        public string Data_Destruction_Instructions { get; set; }
        public Nullable<int> Contract_ID { get; set; }
        public bool Draft_Status { get; set; }
        public bool Admin_Only { get; set; }
        public string Dataset_Alias { get; set; }
        public bool Loc_Amazon { get; set; }
        public bool Loc_IT_Research { get; set; }
        public bool Loc_Research_Proj { get; set; }
        public bool Loc_Secure_Data { get; set; }
        public bool Loc_Mercury { get; set; }
        public bool Loc_Research_CC { get; set; }
        public bool Loc_Research_VM { get; set; }
        public bool Loc_External { get; set; }
        public bool Access_Url { get; set; }
        public bool Access_Download_App { get; set; }
        public bool Access_Lab_Terminal { get; set; }
        public bool Access_Email_Req { get; set; }
        public bool Access_File_Download { get; set; }
        public bool Access_Other { get; set; }
        public string Location_Notes { get; set; }
        public string Access_Notes { get; set; }
        public Nullable<System.DateTime> Date_Added { get; set; }
        public Nullable<System.DateTime> Date_Modified { get; set; }
        public string Added_By_User { get; set; }
        public string Updated_By_User { get; set; }
        public bool External_Collaborators
        {
            get; set;
        }    

    }

这是我的新 ViewDataset (viewmodel)

public class ViewDataset
{
    public Dataset dataset;
    public List<SelectListItem> categories_list;

}

这是我的视图示例...几行,但视图正确填充了来自 ViewDataset 模型的数据

 @model ResearchDataInventoryWeb.Models.ViewDataset  

 <td>
                                    @Html.TextBoxFor(model => model.dataset.Institution, new { placeholder = "<Institution>", @class = "input-box" })
                                </td>

                                <td>
                                    @Html.TextBoxFor(model => model.dataset.Name, new { placeholder = "<Dataset Name>", @class = "input-box" })
                                </td>

 @Html.CheckBoxFor(model => model.dataset.Domestic)&nbsp;&nbsp;<span class="display-checkbox">Domestic</span>
                            @Html.CheckBoxFor(model => model.dataset.International)&nbsp;&nbsp;<span class="display-checkbox">International</span>
                            @Html.CheckBoxFor(model => model.dataset.Includes_PHI)&nbsp;&nbsp;<span class="display-checkbox">Includes PHI </span>
                            @Html.CheckBoxFor(model => model.dataset.Includes_PIL)&nbsp;&nbsp;<span class="display-checkbox">Includes PII </span><br />
                            @Html.CheckBoxFor(model => model.dataset.External_Collaborators)&nbsp;&nbsp;<span class="display-checkbox">External Collaborators Allowed (Sharable)</span>
                            @Html.CheckBoxFor(model => model.dataset.Citation_Requirements)&nbsp;&nbsp;<span class="display-checkbox">Citation Requirements</span>

<input type="submit" value="TestPost" />

这是我的 HttpPost TestDataset:我从视图传回的模型 Viewdataset (dataset, categories_list) 属性为 NULL,我错过了什么吗?

   [HttpPost]
        public ActionResult TestDataset(ViewDataset viewdataset)
        {
            using (var client = new HttpClient())
            {

                client.BaseAddress = new Uri("http://localhost:4251/");

                //HTTP POST
                viewdataset.dataset.Category_ID = 2;
                viewdataset.dataset.Dataset_ID = 1;
                viewdataset.dataset.Location = "Fingers Crossed";
                viewdataset.dataset.Institution = "Not Null";
                var dataset = viewdataset.dataset;
                // var postTask = client.PostAsJsonAsync<Dataset>("api/datasets/1", dataset);
                var postTask = client.PostAsJsonAsync("api/datasets/1", dataset);
                postTask.Wait();

                var result = postTask.Result;
                if (result.IsSuccessStatusCode)
                {
                    return RedirectToAction("Index");
                }
            }

            ModelState.AddModelError(string.Empty, "Server Error. Please contact administrator.");

            return View(viewdataset);
        }

这里如果我的 HttpGet TestDataset 以防你需要查看它

 public async Task<ActionResult> TestDataset()
    {
        //Hosted web API REST Service base url  
        string Baseurl = "http://localhost:4251/";
        List<Dataset> dataset = new List<Dataset>();
        List<Category> categories = new List<Category>();
        var parm = "1";
        var returned = new Dataset();
        var ViewDataset = new ViewDataset();
        using (var client = new HttpClient())
        {
            //Passing service base url  
            client.BaseAddress = new Uri(Baseurl);

            client.DefaultRequestHeaders.Clear();
            //Define request data format  
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

            //Sending request to find web api REST service resource GetAllEmployees using HttpClient  
            HttpResponseMessage Res = await client.GetAsync("api/Datasets/" + parm);
            HttpResponseMessage Res2 = await client.GetAsync("api/Categories");

            //Checking the response is successful or not which is sent using HttpClient  
            if (Res.IsSuccessStatusCode)
            {
                //Storing the response details recieved from web api   
                var EmpResponse = Res.Content.ReadAsStringAsync().Result;


                //Deserializing the response recieved from web api and storing into the Employee list  
                returned = JsonConvert.DeserializeObject<Dataset>(EmpResponse);


            }

            if (Res2.IsSuccessStatusCode)
            {
                //Storing the response details recieved from web api   
                var CatResp = Res2.Content.ReadAsStringAsync().Result;


                //Deserializing the response recieved from web api and storing into the Employee list  
                categories = JsonConvert.DeserializeObject<List<Category>>(CatResp);


            }

            // Create the Categories Select List
            var categoryList = new List<SelectListItem>();
            foreach (Category c in categories)
            {
                categoryList.Add(new SelectListItem
                {
                    Value = c.Category_ID.ToString(),
                    Text = c.Description,
                    Selected = (c.Category_ID == returned.Category_ID ? true : false)

                });
            }

            ViewDataset.dataset = returned;
            ViewDataset.categories_list = categoryList;
            //returned.External_Collaborators = returned.External_Collaborators == null || false ? false : true;
            //returning the employee list to view  
            return View(ViewDataset);
        }
    }

【问题讨论】:

    标签: asp.net-core model-view-controller razor viewmodel


    【解决方案1】:

    尝试改变

    public class ViewDataset
    {
        public Dataset dataset;
        public List<SelectListItem> categories_list;
    
    }
    

    public class ViewDataset
        {
            public Dataset dataset { get; set; }
            public List<SelectListItem> categories_list { get; set; }
    
        }
    

    【讨论】:

    • 谢谢,我想我很着急,我没有输入我的吸气剂和设置。感谢回复
    猜你喜欢
    • 2020-09-13
    • 1970-01-01
    • 2020-06-18
    • 1970-01-01
    • 2015-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多