Home > other >  ASP.NET Core 6 Write value to Page without iteration?
ASP.NET Core 6 Write value to Page without iteration?

Time:10-06

I am trying to write a specific value to a page in ASP.NET Core 6. I found multiple solutions with iterators but I am not able to write a single value from non-iteratable models / instances (no enumerators & lists) to a page.

public class UserViewModel
{
    public string Id { get; set; }
    public string UserName { get; set; }
    public string Email { get; set; }
}

This models purpose is to get filled with values from the Identity Framework.

public UserViewModel umodel { get; set; }

Said model gets instanced, filled without any problems - it holds values (checked via console) in page.cshtml.cs:

var user = await _userManager.FindByIdAsync(id);
    
UserViewModel UserModel = new UserViewModel();

UserModel.UserName = user.UserName;
UserModel.Email = user.Email;
UserModel.Id = user.Id;

Console.WriteLine(UserModel.UserName);
Console.WriteLine(UserModel.Id);
Console.WriteLine(UserModel.Email);

If I try to access it on the corresponding page (page.cshtml) I can only access its name without any problems:

@Html.DisplayNameFor(model => model.umodel.Email)

When I want to access its content there is no value on the page.

@Html.DisplayFor(model => model.umodel.Email)

How can I access the values in this model on a razor page? All the solutions I found based on some kind of iterator and therefore models that had some kind of enumerator or where instanced and filled as a list.

CodePudding user response:

From the code you posted, you aren't populating the page's UserViewModel property. You instantiated a different UserViewModel instance. You wrote the values of that to the Console, but the actual model property (umodel) has not been populated.

Try this in the OnGet method:

var user = await _userManager.FindByIdAsync(id);
    
umodel.UserName = user.UserName;
umodel.Email = user.Email;
umodel.Id = user.Id;

When rendering property values, you don't need the DisplayFor helper (unless you are using display templates). You just need to prefix the property with @:

@Model.umodel.UserName

CodePudding user response:

I figured it out. There hast to be an instance of the model / class but in a specific way and naming. See following example:

Model:

public class IdentityUserModel
{
     public string Id { get; set; }
     public string ?UserName { get; set; }
     public string ?Email { get; set; }
}

Reference to model in the Main class of the Page (page.cshtml.cs):

public IdentityUserModel IUserModel { get; set; }

Then the important part in the OnGet/OnGetAsync function(?) (page.cshtml.cs):

IUserModel = new(); // <-- instance

var user = [whatever...]

IUserModel.UserName = user.UserName;
IUserModel.Email = user.Email;
IUserModel.Id = user.Id;

Then to write on the page.cshtml:

@Model.IUserModel.Id

My understanding is that there has to be an instance of the class in die page context with exactly the same name (therefore = new() without instance name). I may have been blind but reading throug microsofts learn pages again this is was not clear at all to me.

Thanks to Mike Brind for sending me in the right direction with his input.

  • Related