8

Итак, я создаю веб-сайт ASP.NET MVC.Где я могу хранить дополнительные данные пользователя с помощью ASP.NET MVC и SqlMembershipProvider?

У него довольно сложная страница регистрации пользователей с большим количеством полей. Мой вопрос: где я должен упорствовать в этом? Таблицы пользователей, созданные средством-провайдером членства, не содержат этих столбцов, и я не понимаю, что лучше всего подходит для хранения этой дополнительной информации о каждом пользователе?

Действительно ли это, когда поставщик профилей вступает в игру? Как они работают? Если нет, как еще вы сохраняете и сохраняете дополнительные данные пользователя, не указанные в столбцах акций таблиц MembershipProvider?

Может кто-нибудь мне точку на некоторые ресурсы о том, как это осуществляется, как получить доступ к этим дополнительные пользовательские данные, когда они нужны мне, как создать нового пользователя со всей этой информацией и т.д.

ответ

3

Здесь входит поставщик профиля ASP.NET. Вы можете использовать его для хранения любой информации о профиле, которую вы хотите о пользователе. Все, что вам нужно сделать, это добавить поля, которые вам нужны, в файле web.config, MSDN Link on how to configure the profile fields in web.config file. Чтобы суммировать статью, вы просто добавляете значения имени и типа, которые хотите сохранить, в узел свойств элемента профиля. Вот пример:

<profile enabled="true"> 
    <properties> 
    <add name="Name" /> 
    <group name="Address"> 
     <add name="Street" /> 
     <add name="City" /> 
     <add name="Zip" type="System.Int32" /> 
    </group> 
    </properties> 
</profile> 

В ASP.NET WebForms, Visual Studio автоматически создает класс строго типизированных профиль, который будет ссылаться на пользовательские свойства профилей. В MVC этого не происходит. Чтобы ссылаться на информацию профиля пользователя, просто вызовите HttpContext.Profile ["PropertyName"]. Пример:

HttpContext.Profile["Name"] = name; 
HttpContext.Profile.GetProfileGroup("Address")["Zip"] = zip; 

Edit: Как отметил Энди, используя SqlProfileProvider по умолчанию не очень хорошо, если вы хотите, чтобы выполнять запросы по этим свойствам. Он совершенно прав, и, возможно, я должен был первоначально отметить это ограничение. Это ограничение существует, поскольку SqlProfileProvider сохраняет все данные профиля в трех столбцах: PropertyNames и PropertyValuesString/PropertyValuesBinary. Все ключи хранятся в поле PropertyNames, значения, которые могут быть сохранены в виде строки, хранятся в поле PropertyValuesString и т. Д. Это означает, что чрезвычайно сложно выполнить запрос типа «Выберите * из aspnet_Profile, где Age> 10».

3

Я не уверен, что существует лучшая практика, и это действительно зависит от того, как вы хотите использовать эту информацию.

Во-первых, вы должны признать, что членство и профили - это две отдельные вещи. Функции членства, профиля и роли ASP.NET предназначены для использования в качестве службы, обслуживающей несколько сайтов/приложений.

Если вы посмотрите на схему этих отношений, вы заметите, что пользователи уникальны для системы, но пользователь может быть доступен для разных приложений. Это означает, что их информация о профиле совместно используется для приложений. Членство на самом деле является ассоциацией пользователя с приложением и содержит информацию об их отношении к этому конкретному приложению (пароль, пароль Q & A и т. Д.).

Вы можете использовать поставщика профайлов, как предлагал Райан, но 1) эту информацию нелегко запросить, если вы хотите собрать метрики профиля и 2) она будет доступна для всех пользователей услуг членства/профиля. Однако вы можете расширить его, чтобы удовлетворить ваши потребности.

Вы можете расширить поставщика членства, как предлагал Горток, и эта информация будет относиться к приложению, но вам нужно убедиться, что вы не нарушаете существующих потребителей услуги, изменяя существующие хранимые процедуры или таблицы таким образом, чтобы изменяет их интерфейс или намерение.

Другой вариант - вы можете рассматривать его как услугу и отслеживать эту информацию самостоятельно, ссылаясь на свою собственную реализацию профиля, используя идентификатор пользователя от поставщика asp.net sql.

Существует хорошая серия (16 частей) на Membership, Profiles, and Roles на 4 парнях из Роллы, которые я бы рекомендовал прочитать, а затем, когда вы знакомы со всеми движущимися частями, сделайте обоснованное решение о том, где лучше всего хранить и как лучше структурировать информацию профиля, которую вы хотите создать.

2

Я знаю, что это сообщение опубликовано в течение длительного времени, и вопрос был, вероятно, для mvc2 или ранее.

Теперь mvc3, и я подумал, что, возможно, другие, ищущие ответы для контекста mvc5, могут быть заинтересованы в этом решении.

В стандартном mvc5 проекте, который имеет индивидуальный счет пользователя позволили Вы найдете следующий блок кода готов к использованию в {} проекта /Models/IdentityModel.cs

// You can add profile data for the user by adding more properties to your ApplicationUser class, please visit http://go.microsoft.com/fwlink/?LinkID=317594 to learn more. 
public class ApplicationUser : IdentityUser 
{ 
} 

Просто добавьте в более свойствах этого класс и свойства будут сохраняться в базе данных Например.

public class ApplicationUser : IdentityUser 
{ 
     public string FirstName { get; set; } 
     public string LastName { get; set; } 
     public string Email { get; set; } 
     public bool Active { get; set; } 
     public DateTime DateRegistered { get; set; } 
}