代码之家  ›  专栏  ›  技术社区  ›  MC9000

模型未传递给控制器(MVC核心)

  •  0
  • MC9000  · 技术社区  · 6 年前

    我在视图中得到了一个表单,其中按钮返回到控制器。 除了传递的模型是空的(它没有将模型传递给控制器)之外,其他一切都正常。我在这里查看了其他一些答案,我的代码应该可以工作,但它不能。我做错了什么?

    查看代码段:

    @model LogModel
    
    @using (Html.BeginForm("IPblocking", "Log", FormMethod.Post, @Model))
        {
            <button type="submit" class="btn btn-primary" name="btnIPblocking" value="block">
                @T("Admin.Custom.IPblocking.BlacklistButton")
            </button>
            <button type="submit" class="btn btn-primary" name="btnIPblocking" value="unblock">
                @T("Admin.Custom.IPblocking.WhitelistButton")
            </button>
        }
    

    控制器代码段:

        //IPblocking
        [HttpPost]
        public virtual IActionResult IPblocking(LogModel model,string btnIPblocking)
        {
            if (!_permissionService.Authorize(StandardPermissionProvider.ManageSystemLog))
                return AccessDeniedView();
    
            //TODO: code to call IP block or unblock routine depending on button value
    
            return RedirectToAction("List");
        }
    

    问题是模型对象基本上是空的!将视图的模型恢复到控制器的技巧是什么?

    0 回复  |  直到 6 年前
        1
  •  0
  •   Brando Zhang    6 年前

    根据您的代码,我发现您没有将模型属性作为表单数据发布到控制器操作:

    如果您不想在客户端修改模型值,我建议您可以尝试将其添加为hiddenfield,然后将其发布到操作中。

    像这样:

    @Html.HiddenFor(x=>x.Id);
    

    更多详细信息,请参考以下代码:

    @model LogModel
    
    @using (Html.BeginForm("IPblocking", "Log", FormMethod.Post))
        {
            @Html.HiddenFor(x=>x.Id);
            <button type="submit" class="btn btn-primary" name="btnIPblocking" value="block">
                @T("Admin.Custom.IPblocking.BlacklistButton")
            </button>
            <button type="submit" class="btn btn-primary" name="btnIPblocking" value="unblock">
                @T("Admin.Custom.IPblocking.WhitelistButton")
            </button>
        }
    

    我的日志模型:

    public class LogModel {
        public int Id { get; set; }
    }
    

    结果:

    enter image description here

        2
  •  0
  •   MC9000    6 年前

    我最终使用的是: 查看:

    @model LogModel
    <form asp-controller="Log" asp-action="IPblocking" method="post">
        <input type="hidden" name="ipblocking_IpAddress" value="@Model.IpAddress" />
        <div class="content">
            <div class="form-group">
                <div class="col-md-12">
                    <button type="submit" class="btn btn-primary" name="btnIPblocking" value="block">
                        @T("Admin.Custom.IPblocking.BlacklistButton")
                    </button>
                    <button type="submit" class="btn btn-primary" name="btnIPblocking" value="unblock">
                        @T("Admin.Custom.IPblocking.WhitelistButton")
                    </button>
                </div>
            </div>
        </div>
    </form>
    

    控制器:

    //IPblocking
    [HttpPost]
    public virtual IActionResult IPblocking(string ipblocking_IpAddress,string btnIPblocking)
    {
        if (!_permissionService.Authorize(StandardPermissionProvider.ManageSystemLog))
            return AccessDeniedView();
    
        //TODO: code to call IP block or unblock routine depending on button value
        if (btnIPblocking != null && ipblocking_IpAddress != null)
        {
            try
            {
                //block or unblock ip address here
                bool result = false;
                if (btnIPblocking == "block")
                {
                    result = Nop.Web.Custom.MyData.IPAddress_BlackList_Insert(ipblocking_IpAddress);
                    if (result)
                    {
                        _notificationService.SuccessNotification(_localizationService.GetResource("Admin.Custom.IPblocking.Success"));
                    }
                    else
                    {
                        _notificationService.SuccessNotification(_localizationService.GetResource("Admin.Custom.IPblocking.Fail"));
                    }
                }
                else
                {
                    result = Nop.Web.Custom.MyData.IPAddress_BlackList_Delete(ipblocking_IpAddress);
                    if (result)
                    {
                        _notificationService.SuccessNotification(_localizationService.GetResource("Admin.Custom.IPblocking.Unblock.Success"));
                    }
                    else
                    {
                        _notificationService.SuccessNotification(_localizationService.GetResource("Admin.Custom.IPblocking.Unblock.Fail"));
                    }
                }
            }
            catch (Exception exc)
            {
                _notificationService.ErrorNotification(exc.Message);
            }
        }
    
        return RedirectToAction("List");
    }
    

    还有模型(我之前没有发布,但这里有):

    using System;
    using Nop.Web.Framework.Mvc.ModelBinding;
    using Nop.Web.Framework.Models;
    
    namespace Nop.Web.Areas.Admin.Models.Logging
    {
        /// <summary>
        /// Represents a log model
        /// </summary>
        public partial class LogModel : BaseNopEntityModel
        {
            #region Properties
    
            [NopResourceDisplayName("Admin.System.Log.Fields.LogLevel")]
            public string LogLevel { get; set; }
    
            [NopResourceDisplayName("Admin.System.Log.Fields.ShortMessage")]
            public string ShortMessage { get; set; }
    
            [NopResourceDisplayName("Admin.System.Log.Fields.FullMessage")]
            public string FullMessage { get; set; }
    
            [NopResourceDisplayName("Admin.System.Log.Fields.IPAddress")]
            public string IpAddress { get; set; }
    
            [NopResourceDisplayName("Admin.System.Log.Fields.Customer")]
            public int? CustomerId { get; set; }
    
            [NopResourceDisplayName("Admin.System.Log.Fields.Customer")]
            public string CustomerEmail { get; set; }
    
            [NopResourceDisplayName("Admin.System.Log.Fields.PageURL")]
            public string PageUrl { get; set; }
    
            [NopResourceDisplayName("Admin.System.Log.Fields.ReferrerURL")]
            public string ReferrerUrl { get; set; }
    
            [NopResourceDisplayName("Admin.System.Log.Fields.CreatedOn")]
            public DateTime CreatedOn { get; set; }
    
            #endregion
        }
    }
    

    仍然不确定如何传递整个模型,但这只适用于模型中的一个值。(所以这并不是我最初问题的答案)。使用ASP。净核心2.2