【问题标题】:How do you write a variable value to an mvc cshtml page in aspnetcore2如何将变量值写入aspnetcore2中的mvc cshtml页面
【发布时间】:2017-08-31 01:53:36
【问题描述】:

它是一个 .aspnet core2 站点。 我一直在用不同的方法进行“反复试验”。

除了日期线之外,这些都不起作用,所以我知道剃须刀正在工作。 我只是想在代码中设置 Userid 的值并将其显示为隐藏元素的值。没想到会这么复杂。

索引.cshtml

@model iBasisMobileV14.Models.AccountViewModels.CheckoutViewModel
@using Microsoft.AspNetCore.Http.Authentication
@using Microsoft.AspNetCore.Http
@using Microsoft.AspNetCore.Identity
@using iBasisMobileV14.Models.AccountViewModels

.......
@DateTime.Now.Year //Works OK

@Model.UserID // Object reference not set to an instance of an object.
@Html.Raw(UserID);
@Html.HiddenFor(m => m.UserID , new { @id = "M_UserID" })
<input asp-for="UserID" id="M_UserID"   />

CheckoutViewModel

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Threading.Tasks;

namespace iBasisMobileV14.Models.AccountViewModels
{
    public class CheckoutViewModel
    {
        //[Display(Name = "UserID")]
        private string _UserID;

        public string UserID
        {
            get {
                _UserID = "blabla";
                return _UserID; }
            set { _UserID = value; }
        }


    }
}

结帐控制器

using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Authorization;
using NLog;
using Microsoft.AspNetCore.Identity;
using iBasisMobileV14;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Options;
using iBasisMobileV14.Models;
using iBasisMobileV14.Data.EntityModel;
using iBasisMobileV14.Classes;

namespace iBasisMobileV14.Controllers
{

    public class CheckoutController : Controller
    {
        private readonly UserManager<ApplicationUser> _userManager;
        IHttpContextAccessor _httpContextAccessor;
        private AppSettings _appSettings { get; set; }
        public string UserID { get; private set; }

        public CheckoutController(
           IHttpContextAccessor httpContextAccessor,
            UserManager<ApplicationUser> userManager,
              IOptions<AppSettings> appSettings)
        {
            _userManager = userManager;
            _appSettings = appSettings.Value;
            _httpContextAccessor = httpContextAccessor;
            //Session needs something set or it changes every page load

            UserID = "ccccccccc";


        }

        public IActionResult Index()
        {
            Guid userId = new Guid(_userManager.GetUserId(_httpContextAccessor.HttpContext.User));
            ViewData["UserID"] = "sdfdsfdfsdfdsfd"; //  userId;
            // Logger.Info("Front");
            return View();
        }
    }
}

【问题讨论】:

  • 您没有在 GET 方法中将模型传递给视图,因此模型为 null(您无法访问 null 的对象的属性。只需传递您的 CheckoutViewModel 的实例模型(带有UserID 集)使用return View(yourModel);

标签: c# razor asp.net-core-mvc


【解决方案1】:

首先,您的视图被强类型化为CheckoutViewModel 的实例,并且在您的视图中您正在访问 UserID 属性。但是在您的 GET 操作中,您没有向视图传递任何内容。所以基本上Model 在你看来是空的。您不应该访问NULL 上的属性/调用方法,但这就是您通过在您的视图中执行@Model.UserID 这行来尝试做的事情。

所以解决方案是,创建视图模型类的对象并将该对象传递给视图。

var vm=new CheckoutViewModel();
Guid userId = Guid.NewGuid();  // to do : Replace with your code to get a valid Guid
vm.UserID = userId.ToString();
return View(v);

并且在视图中你可以使用输入标签助手。

@model CheckoutViewModel
<input asp-for="UserID" type="hidden" />

但这将生成一个隐藏的输入,其值为blabla,因为这是您的get 属性部分正在返回的内容!除非您在生成属性值时没有做一些逻辑,否则不需要使用私有属性。您可以简单地使用公共属性

public class CheckoutViewModel
{
  public string UserID { set;get;}
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 2012-01-13
    • 2011-06-23
    • 1970-01-01
    • 2018-03-05
    • 1970-01-01
    相关资源
    最近更新 更多