я пытаюсь передать данные из контроллера в частичное представление в viewdata, но это не сработало правильно - PullRequest
0 голосов
/ 14 ноября 2011

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

код в контроллере

public PartialViewResult PartFace()
    {

        string message = "You are not connected to Facebook";
        string name = "";
        string appid = ConfigurationManager.AppSettings["AppID"];
        FacebookConnect fbConnect = new FacebookConnect();
        if (fbConnect.IsConnected)
        {
            message = "You are connected to Facebook";
            string token = fbConnect.AccessToken;
            token = HttpUtility.UrlDecode(token);
            Facebook.FacebookAPI api = new Facebook.FacebookAPI(token);
            JSONObject me = api.Get("/" + fbConnect.UserID);
        }
        ViewData["Message"] = message;
        ViewData["AppID"] = ConfigurationManager.AppSettings["AppID"];
        ViewData["Name"] = name;
        return PartialView();
    }

код в частичном представлении

<h2><%: ViewData["AppID"]%></h2>
<% if (!string.IsNullOrEmpty((string)ViewData["Name"])) { %>
<h2>Hello, <%: (string)ViewData["Name"]%> </h2>
<% } %>
<p>
    <fb:profile-pic uid="loggedinuser" facebook-logo="true" linked="false"></fb:profile-pic>
    <fb:login-button autologoutlink='true' onlogin='window.location.reload()' perms='read_stream,publish_stream,read_friendlists,user_activities'></fb:login-button>
</p>
 <div id="fb-root"></div>
<script type='text/javascript'>
    window.fbAsyncInit = function () {
        FB.init({ appId: '<%= ViewData["AppID"] %>', status: true, cookie: true,
            xfbml: true
        });
    };
    (function () {
        var e = document.createElement('script'); e.async = true;
        e.src = document.location.protocol +
      '//connect.facebook.net/en_US/all.js';
        document.getElementById('fb-root').appendChild(e);
    } ());
</script>

код для вызова этого частичного на главной странице

<% Html.RenderPartial("~/Views/Home/PartFace.ascx"); %>

Ответы [ 3 ]

1 голос
/ 14 ноября 2011

Вы визуализируете частичное представление напрямую.Чтобы получить данные от контроллера, вы должны вызвать RenderAction следующим образом:

<% Html.RenderAction("PartFace"); %>

Обратите внимание, что если вызов выполняется из представления, отображаемого контроллером, отличным от того, которое содержит действие PartFaceВы также должны указать соответствующий контроллер:

<% Html.RenderAction("PartFace", "[controller]"); %>
1 голос
/ 14 ноября 2011

Создайте ViewModel:

    public class ViewModel
    {
        public string Message { get; set; }
        public int AppId { get; set; }
        // ...
    }

Передайте его на ваш вид, подобный этому

return View(new ViewModel() { Message = "Works" });

, затем вы можете получить доступ к этому в вашем представлении, установив

@model ViewModel;

@Model.Message 

если вы хотите передать информацию в частичное представление, вы можете сделать это (по вашему мнению)

Html.RenderPartial("~/Views/Home/PartFace.ascx", Model) 

, если вы хотите передать свою модель, или

Html.RenderPartial("~/Views/Home/PartFace.ascx", Model.AppId)

, если вы хотитеappid передается вашему частичному.

надеюсь, это поможет

0 голосов
/ 13 июня 2016

У меня была похожая проблема, это решение помогло мне.

  1. Создана коллекция ViewDataDictionary
  2. назначил коллекцию свойству viewData частичного перед возвратом.

    public PartialViewResult PartFace() {
    
    string message = "You are not connected to Facebook";
    string name = "";
    string appid = ConfigurationManager.AppSettings["AppID"];
    FacebookConnect fbConnect = new FacebookConnect();
    if (fbConnect.IsConnected)
    {
        message = "You are connected to Facebook";
        string token = fbConnect.AccessToken;
        token = HttpUtility.UrlDecode(token);
        Facebook.FacebookAPI api = new Facebook.FacebookAPI(token);
        JSONObject me = api.Get("/" + fbConnect.UserID);
    }
    
    ViewDataDictionary viewData = new ViewDataDictionary();
    viewData.Add("Message", message);
    viewData.Add("AppID",  ConfigurationManager.AppSettings["AppID"]);
    viewData.Add("Name",  name);
    
    var partialView = PartialView();
    partialView.ViewData = viewData;
    
    return partialView;
    }
    
...