繁体   English   中英

无法通过视图将 Model 数据从控制器的 GET 方法发送到控制器的 POST 方法

[英]Unable to send Model Data from Controller's GET Method to Controller's POST Method via View

我正在通过 ViewBag(ViewBag.AffiliateData) 将附属公司列表从 controller 的 get 方法发送到 View,并期望在控制器的 HTTP Post 方法(myAffiliateList)中获得相同的列表,但收到的值为 null。你能帮我理解一下吗我在这里做错了什么?

注意:我发送的数据是隐藏的,因为它不需要显示。 因此,我试图在 HTTP-Post 方法中获取 2 个值,一个被选中,另一个用于动态填充 select 框的整个列表。

Model:

public class ModelOld
{
    public string Aname { get; set; }
    public string Acode { get; set; }
}

public class ModelNew
{
    public string Acode { get; set; }
    public IEnumerable<ModelOld> myAffiliateList { get; set; }
}

Controller:用户邀请.cs

// GET Method
public ActionResult Import()
{

    List<ModelOld> affiliateList = new List<ModelOld>();
    ModelNew affiliateList1 = new ModelNew();
    var affiliateMappingList = Configuration.GetSection("AffiliateMapping").GetChildren();
    foreach (var KeyValuePair in affiliateMappingList)
    {
        affiliateList.Add(new ModelOld()
        {
            Aname = KeyValuePair.Key,
            Acode = KeyValuePair.Value
        });
    }
    affiliateList.Insert(0, new ModelOld { Acode = "", Aname = "--Select Your Affiliate--" });
    affiliateList1.myAffiliateList = affiliateList;
    ViewBag.AffiliateData = affiliateList1.myAffiliateList;
    return View();
}

[HttpPost]
public async Task<ActionResult> ImportAsync(string Acode, IEnumerable<ModelOld> myAffiliateList)
{
    //Some Code
}

查看:Import.cshtml

@model ModelNew
<!DOCTYPE html>
<html>
<body>
@using (Html.BeginForm("Import", "UserInvitation", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
    <div class="row">
        <div class="form-group">
            <div class="col-md-offset-3 col-md-10">
                <label class="col-md-offset-3 col-md-2" title="Select Your Affiliate" style="font-size:large;"><b>Affiliate:</b></label>
                <select id="affiliate" class="form-control" style="-webkit-appearance:listbox" asp-for="Acode" asp-items="@(new SelectList(ViewBag.AffiliateData,"Acode","Aname"))">
                </select>
                
                @Html.HiddenFor(m => m.myAffiliateList, htmlAttributes: new { @Value = ViewBag.AffiliateData })
                
            </div>
        </div>
    </div>
    <br />
    <div class="row">
        <div class="form-group">
            <div class="col-md-offset-3 col-md-10">
                <br />
                <button type="submit" id="btnSubmitData" title="Click to Invite the Users" class="btn btn-info">
                    <i class="glyphicon glyphicon-upload"></i> Invite Users
                </button>
            </div>
        </div>
    </div>
}
</body>
</html>

这是一个完整的工作演示:

Model

public class ModelOld
{
    public string Aname { get; set; }
    public string Acode { get; set; }
}   
public class AffiliateModel
{
    public string Aname { get; set; }
    public string Acode { get; set; }
}

public class ModelNew
{
    public string Acode { get; set; }
    public IEnumerable<ModelOld> myAffiliateList { get; set; }
}

看法

@model ModelNew
@{
    var data = TempData["AffiliateData"] as string;
    TempData.Keep("AffiliateData");   //be sure add this to persist the data....
    var list = System.Text.Json.JsonSerializer.Deserialize<IEnumerable<ModelOld>>(data);
}
<!DOCTYPE html>
<html>
<body>
    @using (Html.BeginForm("Import", "Home", FormMethod.Post, new { enctype = "multipart/form-data" }))
    {
        <div class="row">
            <div class="form-group">
                <div class="col-md-offset-3 col-md-10">
                    <label class="col-md-offset-3 col-md-2" title="Select Your Affiliate" style="font-size:large;"><b>Affiliate:</b></label>
                    <select id="affiliate" class="form-control" style="-webkit-appearance:listbox" asp-for="Acode" 
           asp-items="@(new SelectList(list,"Acode","Aname"))">   @*change here....*@
                    </select>
        
                </div>
            </div>
        </div>
        <br />
        <div class="row">
            <div class="form-group">
                <div class="col-md-offset-3 col-md-10">
                    <br />
                    <button type="submit" id="btnSubmitData" title="Click to Invite the Users" class="btn btn-info">
                        <i class="glyphicon glyphicon-upload"></i> Invite Users
                    </button>
                </div>
            </div>
        </div>
    }
</body>
</html>

Controller

[HttpGet]
public async Task<IActionResult> Index()
{
    List<ModelOld> affiliateList = new List<ModelOld>();
    ModelNew affiliateList1 = new ModelNew();
    var affiliateMappingList = Configuration.GetSection("AffiliateMapping").GetChildren();
    foreach (var KeyValuePair in affiliateMappingList)
    {
        affiliateList.Add(new ModelOld()
        {
            Aname = KeyValuePair.Key,
            Acode = KeyValuePair.Value
        });
    }
    affiliateList.Insert(0, new ModelOld { Acode = "", Aname = "--Select Your Affiliate--" });
    affiliateList1.myAffiliateList = affiliateList;

    //change here....
    //or asp.net core 2.x,you could use NewtonSoft.Json -----JsonConvert.SerializeObject(affiliateList1.myAffiliateList);

    TempData["AffiliateData"] = System.Text.Json.JsonSerializer.Serialize(affiliateList1.myAffiliateList);


    return View();
}
[HttpPost]
public async Task<ActionResult> ImportAsync(string Acode)
{
    var data = TempData["AffiliateData"] as string;
    IEnumerable<AffiliateModel> myAffiliateList = System.Text.Json.JsonSerializer.Deserialize<IEnumerable<AffiliateModel>>(data);
    return View();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM