Контроллер возвращает содержимое массива, но, на мой взгляд, я получаю только тип? MVC

У меня есть контроллер, который возвращает viewModel.

У этого viewModel есть свойство Users, которое представляет собой массив всех имен пользователей, которые в данный момент имеют учетную запись в системе. Это используется для плагина тегов jquery.

Свойство Users правильно отправляет массив в представление

Но когда я использую @Model.Users в представлении я просто получаю тип т.е. System.String[]

Я предполагаю, что это что-то смехотворно простое, чтобы решить.

контроллер

public virtual ActionResult Create(int id)
    {

        var viewModel = new AttendeeViewModel();

        var data = viewModel.GetMembershipUserList() ;
        viewModel.MeetingID = id;

        viewModel.Users = data.ToArray();

        return View(viewModel);
    } 

ViewModel

public class AttendeeViewModel
{

    public int AttendeeId { get; set; }
    public string Name { get; set; }
    public int MeetingID { get; set; }
    public string[] Users { get; set; }

    public List<string> GetMembershipUserList()
    {
        List<string> userNames = new List<string>();
        foreach (MembershipUser user in Membership.GetAllUsers())
        {
            userNames.Add(user.UserName);
        }

        return userNames;

    }
}

Просмотр использования

<script type="text/javascript">

    var tags = @Model.Users

    $(document).ready(function () { $("#mytags").tagit({ availableTags: tags }); });


</script>

2 ответа

Решение

@Model.Users эквивалентно демпингу Model.Users.ToString() на вид. Для вашего конкретного использования вам нужно представить его в виде массива JavaScript. Строковый массив A C# не знает, как это сделать. Что-то вроде:

 var tags = [ @( string.Join("," Model.Users.Select(s => "'" + s + "'").ToArray()) ) ];

Хотя, вероятно, лучше сделать это из ViewModel и просто Model.UsersAsJavaScriptArray или что-то типа того. Если бы я делал это часто, я бы, вероятно, создал метод расширения для HtmlHelper и сделал бы @Html.AsJavaScriptArray(Model.Users)

Как сказал Мэтт, когда вы пытаетесь вывести что-либо, используя <% =%> или @, оно просто собирается.ToString().

Вместо этого вы можете попробовать...

ViewModel.UsersJson = new JavascriptSerializer().Serialize(data.ToArray());

Или даже только сериализовать то, что вам нужно...

ViewModel.UsersJson = new JavascriptSerializer().Serialize(data.ToArray().Select(u => new { Username = u.Username, FirstName = u.FirstName });

...

var tags = @Model.UsersJson
Другие вопросы по тегам